gource-0.54/0000755002342600234260000000000014362112042012561 5ustar andrewcandrewcgource-0.54/build-aux/0000755002342600234260000000000014362112037014457 5ustar andrewcandrewcgource-0.54/build-aux/install-sh0000755002342600234260000003601014362112037016463 0ustar andrewcandrewc#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # 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. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # 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_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 is_target_a_directory=possibly 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 *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi 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 if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi 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. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac 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. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 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 oIFS=$IFS IFS=/ set -f set fnord $dstdir shift 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=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_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` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gource-0.54/build-aux/test-driver0000755002342600234260000001104214362112037016653 0ustar andrewcandrewc#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2018-03-07.03; # UTC # Copyright (C) 2011-2018 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 tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_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 the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gource-0.54/build-aux/compile0000755002342600234260000001632714362112037016046 0ustar andrewcandrewc#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 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 | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gource-0.54/build-aux/config.sub0000755002342600234260000010645014362112037016450 0ustar andrewcandrewc#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-22' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # 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 or ALIAS Canonicalize a configuration name. Options: -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-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ 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/'` ;; -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 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; 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-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | 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-pc 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 ;; asmjs) basic_machine=asmjs-unknown ;; 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*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; 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 ;; 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 ;; vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-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) 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) 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 ;; sh5el) basic_machine=sh5le-unknown ;; 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 ;; x64) basic_machine=x86_64-pc ;; 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 ;; 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 ;; 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 ;; 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 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now 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* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -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* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # 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 | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -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 ;; -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 ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-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-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gource-0.54/build-aux/depcomp0000755002342600234260000005602014362112037016037 0ustar andrewcandrewc#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gource-0.54/build-aux/config.guess0000755002342600234260000012637314362112037017013 0ustar andrewcandrewc#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # Note: order is significant - the case branches are not exclusive. case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "$machine-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$set_cc_for_build" SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "$sc_kernel_bits" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "$HP_ARCH" = "" ]; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ "$HP_ARCH" = hppa2.0w ] then eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) if objdump -f /bin/sh | grep -q elf32-x86-64; then echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 else echo "$UNAME_MACHINE"-pc-linux-"$LIBC" fi exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: # eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gource-0.54/build-aux/missing0000755002342600234260000001533614362112037016066 0ustar andrewcandrewc#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 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=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://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 'autom4te' 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gource-0.54/COPYING0000644002342600234260000010451314362112037013624 0ustar andrewcandrewc 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 . gource-0.54/data/0000755002342600234260000000000014362112040013470 5ustar andrewcandrewcgource-0.54/data/beam.png0000644002342600234260000000055714362112037015117 0ustar andrewcandrewcPNG  IHDRҦbKGD pHYs  tIME,ZiTXtCommentCreated with GIMPd.eIDAT(m[nBA COC]_ @ƙJo#ۑm@9e|]=%}}̹KL @ 2YFEdYTR>`{l˃\\N:D7,u'o,N'[I{E0Դ _tWFf~z*p9̵(w{k w-o*(A$ ;ywGީ#Ǐfa''IENDB`gource-0.54/data/fonts/0000755002342600234260000000000014362112040014621 5ustar andrewcandrewcgource-0.54/data/fonts/FreeSans.ttf0000644002342600234260000256333014362112040017062 0ustar andrewcandrewc0FFTMT GDEFb2? d8GPOS7 THhGSUBt j3rOS/2)s@VcmapTcvt 6i fpgm/f\egasp d(glyf s&$headO<6hheat$hmtx+!Rkern_loca8Li$Rmaxp55 name! ULpostf k,prep\nchRX_< Ȼ Ȼ r+Zr:du/]1 B0GNU @  8,`XX|c4,,!y40MIM&(H2WM.W,+,f,", ,,#,+,.,%,&nnH-H2H2,M"O0YZcZ ,SdO,PAKL &[ &]0cU c@,,M,*,6,,(,,FB:DAF,F,$,6,ME",A N+dNHKz,4,,C, d,+Mr%-H(M.M^H2^^M\,A0WM'^Em(.e=e=o,` 0ZZZZG L & & & & &H_ UUUU [cC,*,*,*,*,*,**,(,(,(,(),$,F,$,$,$,$,$H2c,A,A,A,A+6,*,*,+0000Y,Z,(Z,(Z,(Z,(Z,( ,, ,, ,, ,,S,F',_TdBO::,F@,PB,PoD,PD,L,FL,FL,F.l,F &,$ &,$ &,$+$]ME]ME]M10"0"0"0"ccc U,AU,AU,AU,AU,AU,A  ccc,V0P,6T00?0O,64&Z/0c", yFBYO:Y0A@,F &&5$&$J0,6[0"cMccUpA U ,cc c  ",",@,6drdH2|YY  P PDLL F,* &,$U,AU,AU,AU,AU,A,(,*,* * ,, ,,O: &,$ &,$c 5YY  ,,v[L,F,* * c,,*Z,Z,({| &, &,$]M]M-U,U,A0"c S,Fc,*Z,( &,$ &,$ &,$ &,$ ,*2;,6 `Z,(,($("$"!T,,, ,F,F,F BDjDAFAFAFRTF7F,$ $.M M t MEMETs"6"6"+*5Tr"B , 5(4,/,/,/0 &F"o.F&&FZ,/,/ DUD-:wM M &g(J11WWWMMOMMMMM3M3MMMMM\MdMMSM#MgMgMzM{M M M M MMsM=M9MMMM:MMN(((((HHMMM1M3M.MMG:M nM M M=&1=)2,+5w XU}>e9CC!2h:Qk|;nn1LnMsMV<qAM OFR 5ZtS &dOAKLvA &P[t(c 4 4 T0'$382T024$'&$ (8<'< "$k92#"l"2.; *$2"$2$D64M l49$,,69 &H0PPFP00d8SStPPe SPPFP,"P 0PPxP!NPP.PP0ce ]0Pr8>PSPIjPP*P(&&&FFZ#&$7F7FFjF.F&&-FAF&$a&BF0FFF F$F%&%&AF&$F-UFAF7F.F<* 0&& PGF P<FYPFM  OPF >*"PFPF GP:FPF"P(F*0&0&c B L ~0 0v<0vPF/$/$P PF  P.FP;Fv<0ePwFP(&(& o"P#&/ /  0$c (P7FP7F.&& 0&& 0&&*$e e e r80FPFjPF0" &?$sPFFF<<F2FFFAFFTF#FI2A(<S- [(FBA-FFA-Fo<F-x-(MO5MMM MAA'F<#9A"AE#aF'A8F9#(FFF#)FF#8A(,AF#'A#AA& A!AHAoA(A(#-FtAB,#* FZM  fn @&y>Fn:O:V&n?>_'o?`=:&&9X%o?m0>z3_=K$?98? N3^>#%<#><8,X7X8423,jjjrTrW>>>#9>kkmIdsXakk>>~Ikc,}  >1?<F$X ;E X  Nl8c`4*Q(88B, 2T|L\3^sG,  c,rqxqvs?Z?q?X?d?N?e?e?"??mj.,8?Xc,"=4/XtD#s#e:+ Y3?- R5w@'/6J/d )RtAM191`$yy(! m+ew_0\@eYZzuzvqpelrf]B-" !|!nn@M <R8 .b obYfz #hYs lN;l?l%5 <, &-r)t.O_) aef K<l<</<X<S<<}Pn<U<<Z<[PPK<o<YP<O<W<,<[<NP<T<P<TPx<Q<tKoxv<N55\5y* $5}5 5O5Gg 32 5.p5  #B\5x]J J x$2r553n  , n q#4275Fi555'[ %$m\$J Y2522222222222222222r2r2r2r22r2r2r2r222[22I2I222222!2222222*22222222222222222222r22r2r22r22222L2222222222222222222222222222W2W2W2W2P2P2P2P2P2b22P2`2222222222222222i2i22222P2P2P2P2P2b22P2`2`222`22`2a22s222a22q22i2i2P2P2P2P2P2b22P2`2P222P22P2P22b222P22`22Z22Z2K222222222222d2<2<22<222222222222222d2<2<2d2<2d22<22<2<22<222p22 22 222p222l222l22l2l22}222l22|2252m2522;2;2[222h2h2>2>2>2V2V2V2V222222222222222R2222222|222222222222222222t2222>2>2>2>2>2>2,2,2,2,2,2,222W2j2p2121212128282828222222222222222P222222922222 2 2 2 2 2 2 22P22k2k2k2 22k2k22P2P2P2P22222 2 2 222 2 2 222222222222222222~2~2~2~2~2~2~2222222P2P2P2P2222212121212v2v2v2v2222222222222222222222222>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>2>22222222222222222222 2P2P22222222222>2>22222222>2>2>2>2>222>2>2>2>2>2>22222>2>2>2>2>2>2a2a22222222222>2>22222>2>2>2>2>2>222>2>2>2>2>2>2>2>22222>2>22222 2>2>22222>2>2222222222262r2k2 2$2"222"2222 2 222 2 222222r22222P22P22222>2>2222,282|282|2282282222222 22i2i2Z22622?2?2222,!,22Z22222P2(22v22222222?2c2,*O,6O,6O,60Y,Y,Y,Y,Y,Z,(Z,(Z,(Z,(Z,(cZ ,,S,FS,FS,F,S,FO:O:O:,P:,P,P,PAKAFAKAFAKAFL,FL,FL,FL,F &,$ &,$ &,$ &,$[,6[,6]ME]M;]M;]M0"0"0"0"0"ccccU,AU,AU,AU,AU,A   ccc,F+*,*,*,*,,*,*,*,*,*,*,*,*Z,(Z,(Z,(Z,(,Z,(Z,(Z,(SN_9 &,$ &,$ &,$ &, &,$ &,$ &,$&5$&5$&5$&5$&5$U,AU,AUpAUpAUpAUpAUpA    T0T0T0T0T0T0T0T0''''''rco$$$$$$$$ UU,8BA"$"$"$"$"$"$w22222222_$$$$$$$$oT0T0''$$8"$"$22$$T0T0T0T0T0T0T0T0><U\C;$$$$$$$$PUKN$$$$$$$$jh5&)T0T0T0T0T0T0T0@MtMtM M $$$$$AkSRBM  xDQM 2222929222  1;""M $$$$$AAP.4MRMvM,dM.M.,,8K6kA@A@M0M1M/M1,&,&^2^FWstW P 111111x 11nb,|,M,;;#H 5NNyNXMBMB|,.0 (?;(z<;$<W1<<<<\<<<^*^^^^^^^^ ^ ^o^Nh-^^E^^^^^^^^^^ ^ ^o^LknhE ^g&Y c,,AFG%[]o2e<6$c:"'Z[! 6wxx)2142wrCP)0Bf)[)0,30@00+(!g.,<V):^)L<rX4[ &R]B]]"c 4 O"o,(2-)L)8:P:V&Cd$:0kFRP ,,P,P $eEeeEeeeeEeeEeeeeEd,dBddd,P0YAKBBBB    BD,AF [-1[-    0-  |8# -|8{  ['-[,['D ,+Z7  H7H7H-H7H7-7i7i$)H(H2H2(H]HK 8KT[[((,ddd,__HKHK=K%H3H*H(H(H2H2H2HIHI*H2H2H(H(H-H---*H-H-H-H-HHH-H-H(H(H-H-H7H7H7H7HH6HH6(|4|P|B|B|E|E+++++LXL`L|>|>|>|>==W@>H(H(|B|B7'bH_I,,d;;II(((,,XXX77, ? 3 3 G = G 5 =         O Y Y Y Y ? G Q ?  D [      Y, k##########|||||||k 2 2 2 2 2 2 2 2 2 2qq d d  |#|#|^|^{^{]|#|#|^|^{^{]$$$ ' ' ' ' ' ' ' ' ' ' ' ' ' ^ 2 2 2 '  ' ' '^2 2 2 2 2 2|#|#|#r 2 2 2 2 ' ' ' '        Br"#S"#r"#S"#M7+777By<2"'''==H(`(h8h8HHH 000HHT6HH>HHh8h8$H0<H 4H6X:0x<D6 HHZD6&?|6h8h7H <8h8h786H8H0H<<6H<6HM.FFF F FRFFFFFFFFF F F:F:F F FFFXFXFXFXFFFFF8FzFeFFFF FHF FFHFFFFFF FFeFFFFFFFF\F6F#FSFSFFLFFFFFdFdFHFF FFFFFwFwFF1FFwF8FzFF FFF FFFFF|FFF@F@FFF@FFFFFFSFzFFwF/FFPFFFFFFyFyF-FBFqFwFPFFFFFwFwFFFF{F FIFFF F FFiF/FRFFBFF F4F4F(F`FF(FeFFLFLF,F,F,FFFF`FvFFFFFFFFFFFFFF FFFSFFlFFFFYF FFwFFFFFFFFFXFXF>FF>FFF\FFFF4FF%F^FFFF-FFFFyFFFFFFFFFOFFlFlFFFFFF-F-FFFF!FFF\FjFFF#F#F#F#FFFFFFFFFFlFzF&F9FF FFnF,FFCFF+FFfFFFFFFFF0FFFFFFFSFFFFFwF0FMVV222{2;,,^LL)&NS'pA/iM' 24 G&-!# T 5 0MK/:w#2"5xFxY|O   } +8:8:r+++++KG]q!:!VwX X  ,1`?n?++!-Z-PP@@  nmq  Dh~3   gHk[[+yy+.VX_HjjezSCO O/Hhh0%%   .F:+O} ?--  +pq+t+ rq    ? q  x _CoJ$3* CGt:+ O3} ?- Hy+ yyWaa n2FHcq8|ULL' a\vuo?]c')B'iN)g'>>|)C|2bxjjrtJ**jUU  5]Jk5])u# = '!|||LLLU,LD[8c?z]s*U QY)*; b(.&bNE9EoE8c(EE9E3E[b& A  r H uK;,(v,/./6h[Q*^KXh[[u2 +*)L\33\ ,G:<01,T$q0`.^)V2[/X1*K*Kb obYfz #hYs lN;l?p% a T 1 @ > [ B g RQ1rr{uojmugZ hZ]Cl a b _ aL AAA AA:18K%z:P&h? 9R%i?%#H2<<<<:::O:V&n? _ `=&&9X%m0z3_=?98?N3^>#%<#>O:&98?H  a?\J.d>-a|,dqV 2C#I C oM}#pn_C1a\<K9I&776OF09057^1F?:9Y=&259\FV9#OHI+N8d03DN/0r7HJ1<n6A8L.`O N7777777H67777&77@7u77M7A7R777 77777b77,D, D~37ouz~asV_ ,J 9 N U r    ( 0 3 6 9 < B H M Q \ ^ u EMWY[]} d q ! !$!3!"I"M"P"b"e"k"s"}"""""""""## ###*##$$$i%K%l%&,&g&o'@** -e-o.+6<>ADO $7Ptz~p|1Ya0 < P X y     * 2 5 8 < > G K Q Y ^ f  HPY[]_ p t !! !&!5!>!A!J!M!S!!!!!!!!""""""" "#"4"<"@"M"P"`"d"j"m"z"""""""""### #)##$$`%%P%&,&`&i'@** -0-o.8>@CFsqgYQO93" $"! @4uig]WOLE#"!  {vsgfjh X ~b~$377Potuzz~~0\ceagps|IM1VSY_ya ,0J 9$ < N^ P Uq X rw y                       ( * 0 2 3 5 6 8 9 < <" > B# G H( K M* Q Q- Y \. ^ ^2 f u3 C F O R h o q v      5      E HM 2PW 8YY @[[ A]] B_} C b      d p q > t @ [ ` n t u !! ! !$ !&!3 !5!< !>!? !A!D !J!K !M!N !S! !! !! !! !! !! !! !! !! """ #"" $"" &"" /"" 8"" :" " <"#". ="4"4 I"<"> J"@"I M"M"M W"P"P X"`"b Y"d"e \"j"k ^"m"s `"z"} g"" k"" u"" v"" "" "" "" "" "" ## ## # ## #)#* ## ## $$$ $`$i %%K %P%l)%%F&,&,&`&g&i&o'@'@*** * -0-e-o-o..+A68<>>@ACDFO1Vd       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a rdei xpk vj Y ;s \ ]gw $ 1 /M El|6cn 9T U 'm} b :  k   y f|qxyzz}{g,K*PXJvY#?+X=YK*PX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-, ڰ+-, Ұ+-, /+\X G#Faj G#F#aj` X db8!!Y!!Y-, %Jd# PX<Y-,@@BBKcKc UX RX#b #Bb #BY @RX CcB CcB ce!Y!!Y-,Cc#Cc#-KPXYF+X!YKRX!Y+\X E+D E+D E+Fv+DY+ R]]((((T$ 8tdLXl8 P H L | , ` |8t4Xt$x <4$xpPTp$88x0Pl,tt  , | !!!t""""""##,#D#$0$H$`$x$$$$$%@%X%p%%%%&&x&&&&&'4''''(((0())))))**(*@***+ +$+<+T++,,,,D,\,t,,,--(-@-.P.h......//(/@//0 0$0<0T0l001x111112 2$2<2T2l2223<3T3l33334 4X4p44444555L5d5|555556 6@6p666667777788 888P8h89|99999: :$:<:T:l;8;<< <== =8=l===>>>4>L>d>|>>???????@@(@@@X@p@@A AABBdBBCHCCD DtDDEE EEF<FGGGGH@HHI$IIJJ`JK8KLLLMDMN<NpNO,OpOPPXPPQ$Q|QRRPRS SXST4TTUU U\UlUUUUUUVV,VDV\VtVVVVVWW$W@W`WWWWXXX4XPXpXXXY8YYYZZ Z[ [$[<[T[l[[[[[[\`\x\\\\\]],]D]\]t]]]]]^^^4^L^d^|^^^^^_ _$_<_T_l____`L```a<aaab$bbbcc,cDc\ctccccddpddeeefdffglgghiiDij`jkkkllllmmtmmnLn`no<ooppppqXqhq|qqr,rxrrs(s<st tdtuu0utuvDvvvvvwDwwxxy,y@yyyz4zz{({<{X{| |||}~<~D|,HDXl(8Px X8\p(<PpX4L`t Hh$8L`|<\$8L`8Th|$8XDp88L`tL,@Tl0H||4H\0L` 4H\p (\l $4D\thx8H|h,D\td,Ll|4<X0H`x \0H`4DTl|LhxDH D(\ ` lH\8(8\l<pp td| |$<Tl@P` ,Ld|8x0È,Ĉ8hŘ8ƌx@tȼ@ɀɼ(\ʐt ̤$͘H΄θ4lϤdФ Ѭ@ӄӠӸ$t\՘D|ָ 8Ph״l؄؜4Ld|ٔ٬ټ,D\l|ڔڬ $<Tlۄۜܤ hDވ8ߤTT<( |\h,(pL0T@8Hp$Hd h` p$lP$`dH0|0x , X|,D\x0HdD,`@ (X0(t@h4d        0   P   0 l   4$hPD,dTxP$P(X, 4|8T $  !!"\"t#`$$%&@&'''(()*,**+p+,D,-,-..\.t./,/00T011,12D2\23<344455<5560667X77788d889(9D9d:l:::;$;l;;;;;;<<,<=>?\?x??@,@A ABBBC<CDD D8D`DEEEFXFG0GH HI IJKLLLM\MNO0PPQQQRSSTlTUV\VWTWXXY$YpYZ@Z[4[\\x\]H]^P^_(__`0`h`a,aabb@bcc$c@c\cdLdehefgh`hxhi@ij,jkXkltmmmnpnno(oppHpq qqrrsdttuTuluuuvlvw wwx|yypzzX{{||}$}~0~xH8Xlx,X|PX(X4 t H<LX,|xx H0H`@00d|p@PPLd t$l l$L8\4(DX<l<X$D |4 ÄT\ŰxxȄ0ɔʨ`̄pdlЄ$,0Ӵ0ՠ,xHذ p ژڬۈ۬@ܴh0ބ޼(ߘH<P<00dh8dPdx0Tl,p\<D|L $HT$8Pp,D\t4Tt(Hd0H`4Lt ,D\,D\|@\$<x0H`x(@Xx   8 P     ` x     ( @ X p        0 H h     8 P    4Ll @`x @`(@`x0Hh(Hh$x$<4Ld|D,h $<Tl4T$<l$<Tl ,Ld|l`   x  !h!!"","D"\"t"""""##,#D#\#t#$$0$X$p$$$$% %$%<%T%l%%%%%& &$&<&T&l&&&''<'x''( (L(d((()0)H)))**4*d**+ +8++,,,<,\,--t-.4.L.d../@/X/x//0 0$0<0T01,112L223 3`3x334,4\4l444445 5,5D55606677h7778 8$8D8\8|899:`:;<;;<@<<=0=H====>,>`>>>??4?L??@@4@h@@@AADAAB BhBBBCC`CCD,D`DDDDE,E`EEEEF(FXFFFGPGGH HLHIITIIJJ J8JxJKKLKdK|KLLPLLLM M,MMNHNOLOPPtPQTQRLRS,ST,TU8UXUhUxUUUUVVpVW8WPWX(XYYZZZ[h[\H\]D]^(^__x_`t`a8aaabbXbccdc|ccdDdde e$e|efDfffg<ghh|hilij0jjjk k`kkklll4lLldlmTmnLndnohopqqrTrst tuXvvw(wx,xyhyzhz{`{|}}p}}}}~~~4~L~d~|~~~~~D|4xH4Ltt8pH<h`(X|$xl,Xd4($\t4Ld|\(H`(@Xp $<Tl $<Tl,D\t4Ll<Tl,D\t,D\t4Ld|4Ld| $<Tl,D\t4Ld| $D\t4Tl,Ld $<Tl4Tl $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld|”¬ $<TlÄÜô,D\lĤĸ(@XpňŠŸ0H`xƐƨ 8Phǀǘǰ(@XtȌȼ $<TlɄɜɴ ,Hdtʄʘʼ,D\tˌ˸8H`̀̐̐̐̐̐̐̐̐̐\`΄μ,dϰШ(DtѤ (҈0`Ә 4hԸDtֈ֨,Hpנ$8l4`Htڐڨ(<Pdxی۠۴,@Th|ܐ0ݨތߌd| $D,<lD(@l $HDXt,<(p(Lt$dt0xPd<   8 L         0 P h       ( @ ` x       ( H X h x      0Xp0dD(D$Lt4L\,tHp$x@d4ttt@Tx,L<L  (   !(!@!"D"\###$$ $t$$%%(%&,&t&',''((,(H(d()$)d)x)*,*D*\*+8++++,,,,@,,-T-..,.@.h.../ /4/P/l///00,0X01112@2223343h3334 404d4444455$5D5X5l555566<6d666677<7\7|77788,8T8|88899D9d9999::4:T:|:;;$;<4= =>,>?d@4@AAAABB@BpBBBC C<CXCxCCCCDD,DHDdDDDDDDEE0EXEEEFF,FTFhF|FFFFFFGG,GHGdGGGGGH H(HDH`H|HHHII(IXItIIIIJJ,J\JpJJJKKKHKtKKKLLL8LTLhL|LLLM8MLM`MtMMMMNNN`NOOO4OLOhOOOOOPP,PHPdPPPPRVYY(Y<YXYlYYYYZZZ0ZLZhZZ[[`[|\H\\^^0^T^p^^^^__8_d_x____``,`T`h`|````aa$a@aTataabPbbd8deXeeeeffdfffggggghh,hHh|hhhhhi<ihi|iiij(jPjxjk k(k<kXkkkll,lHldllllmnoop pqhqqrs,sxst,ttu0yyzz z8zz{{T{{|4|p||}}4}`}~~P~~0<h <@@p@lDHtd$,Px P<(`<xHTp(pH4$p4\HlX|dLDl44TP@X,XtL|$tLDlHx,XØTĔŌH4lthht,| `@ψ(pѰdӠ8\ք\؀<ڀTܸ8pެ߄Tl@DDP$lt48lL`HxDLHd H8t\Xp   `    (  \HLl,0 LHH$\Dd@ @ !<!"t#$#####$$$$L$$$%%,%L%l&&`&'0''(8(()T)*`**+`+, ,--..//T0 0012X23L334t45D556x67X78,8H89H9:(:;8;<<4<===>4>>?@`AABC$DDEFGTGHIPJJK0KLM8MNO(OPQ8RRS`T0TU|V(W8XXZZ[\]^_`abLc$cdefgh<ijjkl8lmnpXrsttv wwxylz|{|}`~<x  0H<xx P( 8 xD@Dh\pLhh\t xT$\4TœØ<, $\,ͼx\ЈL8d@0ܼ݌ޠߘd@4x`,D tHDX,@p<8 D\\ ht P  <  t  \8h(|( p<p !"#$&'@(()*+,-D.4//011234578899:;<=d>P?(@BBCtDEFGI JDKMMNOHP8QDR8SU4VXxYZ[@[\]$]^_d`D`apabcLcdeXefg|hhiijjjkklmm|nnoop pq<qr@rsttuuv@vw wxxDxxyLyyz\z{|}4}~X$|8LT \t(D<0`4$8`pT``T\\ `dl$LPxhTL$Dl00¤4àXŘ08|Șxɸ,`ʰˌ@̈ d$ΐ4pPӀԔTՠ <x,4ڰXPܤ<ݰXެ$ߜh<`8,4d4L|4L@LhXd||<,`,tLXd xD ( <D   8  p (  T`p@(0pl(4| l !!""# #$d%%D%d& &'x(T()t)*+++,<,,--h--.L../L/h//0x0120234X456L67889X9:x;;<,<=h=>??@,@A\ABBCDDDEdEF FlFG(GGH@HHIItIJJJKPK|LxLMNOOOPP P8PPPhPPPPPPQQ(Q@QXQpQQQQQQRR(S STTTTUU U@V,VDVW4WWXPXYYLYZZZ[\|],]^^^^_,___`,`x``a,aPahaaaaabb b8bPbhbbbbbbcc(c@cXcpcccccddd0dHd`de eHeef4fg$gghhhihij8jjk kxkl@lhllm mnpnnoloppq8qr4rrsDst@tuuv0vvwtxxhxyXyz z|z{t||`|}d}~ ~XpTdh8x4,(< Td|8$X(8 0d$p8d,8(hL4$Xd3!%!!X Gf'HI| #'#5'STRhh41 3#'73#'4]']'ooo3#3##7##7#537#537337#3$]jiu'L&|'L&erly$L$}#0| }DDDD!.4;%#5.=3&'&546753#.'%5>54&'oi;emO $]!Ge`;[gO@243"81ZzJ716[ $02"&46"32654&%3#2#"&46"32654&HcdedF)<<*)<;oBuBHceEGddF)<<*)<;dIEdeeF;*)<;)+;^'VdHEdedF;)*;;(+;4}*3%#"&5467.54626=3#>54&#"'322 ;D\qE]/"d\?2Eljp&;Y$]]$Y;&2 ##5#5353FF FFWmh 73#5>=#Wii#32#"& 3265+.@;!wqrvvJFWYM0ܐf[#5>73#f>:X? .R;"632!!>?654&#"2e~dA8u(Ro\`P< t\R6#B-Wu?47U9L $"#632#"'332654##5>54&L9Xesc@8mXHHEN% _OCxSEh[l'ODexMJKCK,A8A %!533##5GBAiiXު]4O6#!!632#".'332654&#"#;Hfk)E-%XrHSTG):Q5W+ip)/wXLO[%+%4>32#.#"632#""32654&+"3G?#Qk X >.LQ:i_zeARR>=PJC^R3bW38O~chSBD[WCGS. #67!5x^(|JϪ W%("&547.5462&"32654"32654z҅y6*ww*spCC87D9RQACSu:waz{av:"@1SjjS2@=32=<24M|NM?>&##"&'33267"&54632"2654&"3G@#Qk X >.LQBze=PJSRk^R3bW38O~chMXCGSTAE[n 7#5#5hhhhhhhhnm #53#5>=#hii#< hh\x&&4-75% -vEOO2oa!5!5aFFFF25-5v EOOM#54>54&#"#4632#5%45%Z%54%F:I8UolatZ%.J1-9 /7%B00=#3?RJswhhh"r5A332654&#"327#".5467>32#"'#"&546322654&#"SZ @hя؟Orpr|yTJBYVLn`BLF]eT&A[6(?b:#X}ꝏ C*kmbC54&+ova(=Z-eF?}/1>D?^r$;;p/T+49E04>32#.#"32673!".00GyL+_^Wj{mZ``!KwG/d2bjO4NNej3Ni`Y3!2#'32654&+YlpplRZe !!!!!dLRRRZC #!!!]t\LRR,$326=#5!#'#"&54>32#.#"$9^]&#&=4&+#!2'4&+326 +q:>]Pks6+LCJEh&0* ")8.IAC?e^>RH6<0m0%2>54/&54632#.#"#".'3V8N%x~X^WJY6BJQ(>gA)KN8%X+U;*)S#0%cswkGMD7*01`C9=. #7\<64Q##5!b]<yRRU3#"&533265(]]eUXdnoOOTJ!#33ddci !# #333ffhdhWPP # #33sqqov0vc #33]socG !!5!5ELfTRR5R@,#3#ggHH#/7,53#53ggHHS,I3# #IEzyE,PB!5B~22P#'`<䔔*)4632327#"&'#"&54>7>=4&#"26=Aad- #()T^O] -<$1&=8:<SEXeJ<6qIF)? %(MTG& &(-0I*^  -P,6 3632#"'#"32654&6S9ihx|hk;KBPPBDUSVZCoooY^p#.#"3273#"&54632T@4DMNEkTp^k}j[m\7;ob]j~`kb#5#"&54632"32654&J"O6jz{fl5DTTEBPP'E1+}Qp[\on[^o(%!3273#"&632!654&#"~+Sf#TvZnmJq&T=?RH(DiV`J@7,AYW###5354632&#"WSFFA: : D8DY8?E5R&("&5463253#"&'3326="32654&\|{db>M0_I\nUqT>#K!CNNDBLK}[LJKeV*TJX_a2,n^_mk^bmF4&#"#3>32#C)@NSS%K8LYSk70aP0'MBtB#7#5SST  ii& 3#"'53265#5FS  $SS mG'%ii: 73##kgQSU޵PD#T'F!3>32>32#4&#"#4&#"#FM"K4a,%H4IOT3.3HT3.3HT J/*P,$KGwi27P9i27P9F3>32#4&#"#FM#Q:LZS:2@NT X70NAtk/8aP$ 2#"&6"32654&q}np}~oFPPFEQOMmmm\an6& 3632#"'"32654&6M;lhy{ea@BPPBDTSO^}NoooY^p&##"&5463253"32654&S9ihx|hk32ATTTM$C( Jg _;3"$732654&/.5462#&#"#"'z5E7C&+N]InbXf3<.3PNFuc/7-%" C>IWTMT+$# E:LZ#327#"&5#5353V'14GGS DF+(DA !#5#"&5332653K%P:L[S:2ANSI4,NA/8aP)  !#33[^^ W !# #333*_je^\kdfgh^e hh #'#373$a__~~^ & 3#"'5326?3Z)^ Y l KSh !!5!5EV9 JIKxI+,!#";#"&=4&'5>=463%$.R%.49",,"94A'EF&x'AE>E< E ;F>Ed,3#d<<S, 5326=47&=4&+532#%RR%/4:!++!:4A'x%&x'AE>E< E EK "#>3232653#"/&/571u5i'*bsNFKE%&?z3 J 4t673#5.546753#.8`TjW*euue*XcT9XEg tZmab wz ZYcV254'#53.54632#&#"&3C;?!h(+*9J+#580E8nQ"e5>,X@M ,> 7+'RD'B8.%B;V.&(791![{ 1W9FC'&%'#"''7&547'76327'"32654&:5(<5)380 687,5:(;97,>?,+?>65391+;9-7575:7)42/>V==*,> !#3##5#535#5333着XUUb3M33M3cBd,3#3#d<<<<oo++4?32654/.5467&5462#54&#"#".57654/=)+571+27,kaT5,&3 =0mkP.4'oII' E50&2&u"J12G33E`bO/70%"^'J6s)"4 H`*J0{'?=3m-<(d4&yYy%0#"&54632#.#"327 #"&54$ 32654(!@(VlmX#G -(9DE8V<ᢚ8@$fi2+]OHb|ߞ✞%/M#-!5%#"'#"&5467>=4#"#63232'3265@"/1808DYC";~zTS.9%6b33_,++4,11 , l^z /(-j 757757-jj5jjYzSSSSyYzSSSS(V w!#5!(FNw.8#58HH#.9#&54574&+#32'3254&+& #"&54$ 32654O"F΍K#(=<ᢚh/ -#%($ ~"*C# ߞ✞w.!5.FF 2#"&46"32654/>YY@=YYfN87&(8Y>@XZ|Y98&'87('2o ##5#5353!5FFFFFFF"#6323!>?654&$>@R`?! 3H:;1 F8R/ #:IL& / +B%"#632#"&5332654&'춮&.#?@K9GUFHO>,-*0 3@.)-,@8;L=IJD.++&'3# $\P-3#q<A$  %#"'#"'#33265332 !S;h6$SS:1ANS-1? SS/8aP)L)0O .546;####an^9@R@^e@JWKy'*32654#"'73632#"'< ! . *& &)B9/N%\8# +2"E #57>73#c6$ +>D.0W(/D!52"&546"2654&:DJKKKC'--N-,b33ZTOZZRQZ4@78@?79@.jm =Q #57>73#3#%#533##=c6$ +>:<:.CC>D.0W'x; 5d=L *#57>73#3#"#6323!>?654&c6$ +>:<:$>@R`?! 3H:;1D.0W' F8R/ #:IL& / +D%)47"#632#"&5332654&'춮&%3#%#533##=.#?@K9GUFHO>,-*0 3@.):<:.CC>-,@8;L=IJD.++&'3# $5'x; 5d`' "] #k$#j$#f$w#|$q#j$#z$ %!#!!!!!!#Ug+n`dRRR(_0*7%2673!632#"'732654#"'7.'.54>32#.#"zZ_`! &)B90M. 8Xy܁!4@r!q3=HFYkbR"6$ f2zK*"ksD*"jsD*"fpD*"|qD*"jp D*"zlD*U/;B%3273#"'&5#"&54>=4#"#632>3226=%!4&#"01e%TvY88e;L\*FGf$vp Tʀ/\6IpFZgG86&P@?R4K%iUak:4TG&9$ N]R&,J@7pQe  ,('-GYW*5.54632#.#"3273#632#"'732654#"'5N&j[mT@4DMNEkTt\ %*B9/N.  8=P,b]7;oc]j^m!# +2!)%("kvH("jxH("f{H("ju H"k)"j"f "j $*4>32&''7&'77"&"32654&$-<8'';a$U4,%Ja(Z*F+"||FPPFEQO@e<' (1-'(,/-%)#MLs>Rmmm\anF"|tQ$"kmR$"jnR$"fnR$"|nR$"jm R2 !5#5#5&hhhFFhhphh##"''7&54632732654&#"?,}og<= B0~oeA:\+?FP)EFPGIm>EJGsAA0m_B 4m_DA"klXA"jlXA"foXA"jh X&"jQ\6& 3632#"'"32654&6S8ifz{ea@BPPBDTSP}NoooY^p&"jV \f#i$*"inD#x$*"xnD3"&5467#'!#3#327 h8L3. KMcx7'H%0px4*$:',6 - L+3T4?632327327#".5467&'#"&54>763>=4#"26=Cad- LH&*:1%9QaO]%(@5)1%u:;QEXeJ<6qIF)?=7 - ,!( CMTG"3" N-0I*^  -P,0#j&"jnF0#f&"fcF0#y&"y\ F0#g&"ggFY#g'#qG #53!2#!326&+3YEE]kppkSCCSC-!3##5#"&546325#5353"32654&??JFbf|{ea@SDTTDBPO5;R|N5LnnlY\mZef#i(("isHZe#x(("xrHZe#y(("yq HZ3"&5467!!!!!!#327@8L3.=ds7'H%04*$:RRR,6 - (4.6%327#"&54>?#"&632!32?54&#"&)(&"&)?L  (pmJq~01e%T=?R)B,(0 - 0( J@6b4K%iAYWIZe#g(("g|H,cf @7 *&"fuJ,#x*&"xaJ,#y*&"yX J,'R*&#JS#f+F#f2K'!5%53!533##!##5w,]w],,]^,ZZHFLF4&#"##53533#>32#C)@NS??S%K8LYSk70aPX5LL50'MBt0i#|,"|f#i,"i*#x,"x3"&5467#33278L3.^7(H%04*$:',6 - 3"&54673#327#5r8L-(S 0#H%0T4*!8 *6 - ii_s#y,T #S  d#-,B&;#ML #f-&&fO'4.:'N: 73 #%#k0gS  F#j/@#jOP' /B'OOP'\/DP'\OP#y/D#yO( 7!!573{(PP]yLzR9M8u 7#573BBS??S3@392@2`L#j1F"jzQL'>1F'QL#g1F"gtQ._&\Qxl$".#5232654.#"#3632(B?l)@>Dm]]:)VR5-LVGNt;dMM\%HRtc0F&#"'532654&#"#3>32 &:2@NTM#Q:LZmG'/8aP X70N&f#i2$"ikR&#x2$"xlR&#}/2$#}R+-4>325!!!!!!5#".7327&#"+(=RM'y>HUNCu(MR<'])94};;|59'dXT6XLRRRJ^5QZIn?' xex'@n$*1%3273#"'#"&54632>32$"32654!4&#"01f#TvY>?q||q=e=Jq،PPFEQX&P@?R4K%iV`ggj28J@7pm^`ml^a3GYW]#j5EK"jU]'H5EA'SU]#g51P"gU0m#j6""jWV0m#f6""fVV0*mJ%2>54/&54632#.#"632#"'732654#"'7&#'.=3V8N%x~X^WJY6BJQ;wT&)B9/N.  ,YgX+U;*)S#0%cswkGMD7*01`C(ED+ # +2"(%E[64"*@732654&/.5462#&#"632#"'732654#"'7&'z5E7C&+N]InbXf3<.3PNF4.&O&)B9/N. /7-%" C>IWTMT+$# E:/N # +2"(%G0m#g6""gTV+Q"32654#"'7##5!##632#"' ! . * < &)B9/N%[RRy7# +2"%/32654#"'7.5#53533#327632#"'B ! . &(*GGSVV &)B9/N%S*$DDF/# +2"Q#g7#^WQ535#5!#3##x<]eHRRHe #3#327#"&=#535#5353VOO'14LLGGS DHF+(HDUi#|8A"|pXUf#i8A"ilXU#x8A"xlXU#z8A"zjXU#} 8A#}XU3#"&5467#"&53326533279L"'9,]eUXd]%44%H%04)/ pOOTJ4W9046 - A4  $327#"&547#5#"&533265#*$'>J`%P:L[S:2AN ; -2+>1I4,NA/8aP)#f8:#fZ #f<&"fV\ q#j<G#j="jZ]Gq#y="yP ]G#g="gX]3##5354632&#"SFFA: :DY8?E5-!533#632#"'##5"3264&YS@ae{|fbFJ?$COPBDTTLL5N|R;X5m\Ylnn0* 0%2>54&+4+3%"5463!2#!#"3263J1>D?F{=G~=Z-eF?vaR1 R+49EM!1N$;;p/TB^r:OPpx6  "32654&!!632#"'BPPBDUS9ihx|hk;oooY^p3IVZC732654&+332#!'@RQA]]dƀRR=@PhxfcË3 "32654&3632#"'#'CBPPBDUSS9ihx|hk;K]oooY^p VZCË0 &0(4>32632&#"#.#"32673!".00GyLHP _^Wj{mZ``!KwG/d2bjO4O;ORNNej3Ni`.,"632&#"#.#"3273#"&54632R T@4DMNEkTp^k}jT>ER7;ob]j~`k0L!%32654&+"5463!2#!#"3263glppl{=GoR1 Rǚ1N:OOo754!35!5!!".6;#"Ot=Y-] 8''8R'+EF:.)-,6  "3264&#5#"&546325!5!&FSUDBPPK;kh|xhi9p^Yooo3CZVI&;$ A6Ze !5!5!5!!5!sdLRR'R/'0m/".547&54632#.#";#"32>=3MQv<ix~X^WJY_?XlC`%N8;U+X6Y\+GG&}1-lcswkGMD7.[RT.)+47Ji5&C!!!!#"'532Zt\QH DL%RRG58Q&##"'53265#5354632&#"W &FFA: : DmG'DY8?E5R,.326=#5!#'#"&54>32632&#"#.#"$9^[cEgI>K57FA+#"&54&#"#3>3232>54&'7/714C)@NSS%K8LYI-F&5Hf1?';d+(/70aP0'MB/#1=+.t3&}; Pv:34632&#"73#:A: :kgQe8?E5޵PS #5333##||T}}TSCCC,"273267#".' #'527.#76*:o0!! z`%6 !$5_LMFb\tMbR @ !#5#"'#"&533265332653S"K4a,%H4JT_/-3C_[3C_J/*P,$LFV27O: iO: &33##"'532Le}XiMG DL%T'OD58LF83>32#4&#"#FM#Q:LZS:2@NT X70NA3/8aP& #"&632.#"!26^pm ԌaVԐ}|Fu& ""2654&#"&63232>54'7t菎>lB @%k=򥤄΢V$$ 6+8]a$5w !"32654&7#"&63232654'FPPFEQO%\%np}~n8R mmm\an+8VEg# & #"2654&#"&632632#4&#"t菎qVT`SI^%&*X򥤄΢V8=gTM5i$8 #"32654&#4&#"#"&632632FPPFEQOHT"'#4np}~nT8@>F@mmm\an]M'*I|))I0#3264&++##"3263#"5463!2gCKKCq[]R1 {=GluDxD]q:O1No6&  ""32654&'632#"'#4632&#"BPPBDTS;lhy{ea@T>9 :oooY^p^}N?9>E[3264&+#332#&=4&#AIIA]]hxVI+q;=DxDxqct:+o.IAC?0m0%2>=3#".546?>54&#"#>32G;U+X%8NK)Ag>(QJB6YJW^X~x%N;46<\7# .=9C`10*7DMGkwsc%0#S)*"$%3#"&546?>54&#"#>2326sXcuFNP3.<3fXbnI]N+&C7E4ZL:E #$+TMTWI>C "%-7G 5!!!!5 fmTRRR&= "2654&#"&4632327#"5i%%2%$2II29B& $$$#IdHD8T'Gm&.5#53533#327#"'53265),GGSVV &+$DDmG'Q4>7!##+"327#"?2]+R16 {Z4+RytO3#327#"&5#5354632&#"VV'14GGA: :^RDF+(DY8?E&Q#5!#327#"&54'%]eUXd]X+8f SnoOOTJ Ao#5#"&5332653>54'J%K%P:L[S:2AN]+8kHI4,NA/8aP)  6U".5332>=4.'3N7MM(](('GF3 4)+l,aJ - '=a?8ciDA &#"#3632  ]s֭-A  i#@  &$!#"'5326?3632&#")^ Yr)^l KU hAl KG3#!!5#537!5EMWfTCRRCR 3#!!57#537!5{SEV]} JCIKCI E7!5!#"'332654#52>Ef ,1|X Qj ҵRT +F,dyMAK  E3"3273#"&'454>7'5!! jQ X|1, f KAMyd,F+ TR q '5!!#"32673#"&546Ə܏0NEHHXmaJIKCKJMxeXc"6 )#"&#"327#"&543232654&+57!5!,aW=6Wb]Baa`\0aSH0Pb &E"LBO40+;KIJ"632'!!>7'57654&#"2e~W(A8u(I_S'`P< t\{O$MD#B-Wo|9"MB7U9L@#%#"&5332654.=#53533#x]hsO?H?H&66&GGSVV&66&]c|nD^8:)5=.DD-"&D6&  !>54&#"#3>32#O'? 7*haTT=_NBW%FGa;' h9$A6F"))P;%^N1aSDB&d,_d,"_n_2,33#3###535#53<<FfFCFfF|Y#?'Y#@'#@,GP#-,/P&#M,/D&w#MOLn#-1L&k#M1F&#M,Q#g$*"gpD"#g,"g&#g2$"gnRU#g8A"goXU#j"8qA5"jn"XqmxU#j"8vA"jn"XvU#jp"8gA"jn"XgpU#j"8CA"jn"XCI( H)#j"$q*9"jp"Dql|#y"$q*!"yl"Dqnd g#q*U#q,-3267#536=#5!3##'#"&54>32#.#"$9^M $5kL\nn^_mk^bmX(4$@2,}[LJ[3468TJ,#g*&"gZJO#g.:s#gfN&#&"&5467.54632327"2654&8L-)Nd0#H%0t菎4*"7Ξ԰eg*6 - p򥤄$#&"&5467.54632327"32654&8L.*\e~nq}qd0#H%0FPPFEQO4*"8vy*6 - mmm\an&#S#q$#"qk E#gyq"g_2&&gY#='Y#]'#],G,#v*&#vJ[D!>54&#"#3>32#O'? >#)k5__=_NB^#.S8d"+9$A6F"!*/!P;%^N,[EP.BL#C1F"CNQ#z b$@0v*#v #v*U#v=#v #v#$#D#$*#DZe#(#HZe#((#H{#>,|#?*#;,#%&#=2#R&#-2$#R]#!5A#|U]#5-Z#kUU#8#XU#8A#X0m'*6"'VQ' 7'lW )"#632'>54.''67654&L9Xes1b0;PX> @[{%LCxSEh[1O1{/O3:WB\$) "K20<8Az("#4632'>54&''67654'5VbOL`"F52\:8 #ZE9.Ja,80PfXD(: #]4,$J "5E' )QS#g+Fs#gK(G!#"'5326=!5!5EL &)fTͽmG'JR5R( )5!5!!#"'53265u9E &KxIJmG'#y$*"yl DZ1e&32654#"'7#!!!!!#632#"' ! . 'ds &)B9/N%URRR1# +2"(/832654#"'7.54632!3273632#"'!654&#" ! . 'esmJq~+Sf#TmT &)B9/N&T=?R%VzJ@7pH(DiR_1# +2"AYW&#q+$9"jm"Rql|&#q)$;"qr~&#y2$"yiR&#q&$""yi"Rqke S#q<&"qT\& 3#"'53265FS & mG'* DA$ #4&#"326"&5463253327#"&'OF?HUC@DKplZBS- #(+&JWySQxwvzPBL)? %+$"# 2 6  ""32654&4632&#"632#"'BPPBDUSA: :9ihx|hk;oooY^p3e8?E5VZC F  -%265.#"7#"''7&54632#.#"676328D-][mN800D0j[mT@4DMW)+-6 M,0I)*<6Ilb]7;obN0H  7&L $"32654&#"&546323327#"5 DTTEBPPY"O6jz{fl5S"' p[\on[^ox1+}Q&GmF $"32654&7#5#"&5463254632&#" DTTEBPPJ"O6jz{fl5A: :p[\on[^oE1+}Q8?E(732#"&'332>7'.#"(mnZvT#f.3!R?327332>7#"#".Y8?R!,#f#TvZd?YE '    -*O=E#m0L0# MSW-D%iV`>]T r-GB^&=0G""#%3#"&547&5462#&#";#"326sXcuVAnbXf3<10>J+;@6E4ZLV&%KIWTMT+$!5L6%-7$":>732654&+532654&#"#>327332>7#".'&'#"'z5E6@;+J>01<3fXb[`7UE (!  -**">AVuc/7-%6L5!$+TMT0OT r-(SE:>K%&VLZ!(>32#"&547"32654&+532654&"az\p",*rcyoG?GO6=;+5)01?WI(5;-LZYsm_-%6L5!$+&  33##"'53265#53lSMM &NN HmG'#K1\|{db><9 0_I\nUn^_mk^bm^b2,}[S9>EJKeV*TJX& /"32654&"&54632>2&#"#"&'3326=CNNDBLKT\|{db<$> 0_I\nUqT>#Kn^_mk^bm}Y#. H%KeV*TJX_a2, !326=#53#'#"&54>32#.#"vMb.`,Lln$8^;]vV C?UVajUB=HV|#HO;'ZR3,k 254''4733". `4ZZ47L0#/(*/NB(F<+4  #/2632#4&#"#"&5467&"#>32>54&4:;5>`L2 (+<-.=^8)%.4LbE-! ,??Af@%6O)Zf)?.Y)T}mG?3'1gF3  K, F4&#"#4632&#">32#C)@NSA::%K8LYSk70aPe8?E60'MBtF&%4&#"#4632&#">32#"'53265C)@NSA: :%K8LY &k70aPe8?E50'MBmG'#5533##5#5TSPPSKii_HHB 327#"&5'14 UF+( 3#3#53#IIRR HHH|"#>32332653#"/#&~/571T 5i'*T"sNFK2 %&]533##"54>5"TT?*("Mq&$R(D& 3327#"DT& mF'GDqJ#"'732654#"57!#3!Yam5I7)ENTT cXexg.KCK=JF  P@ F8 !##"'#"&533265332653M"K4a,%H4IOT3.3HT3.3HT/*P,$KG27P9I27P9IF&*3>32>32#"'532654&#"#4&#"#FM"K4a,%H4IO &3.3HT3.3HT J/*P,$KG mG'27P9i27P9& 3>32#4&#"#"'53265lM#Q:LZS:2@N & X70NAtk/8aPrmG'F&@3>32327#"54&#"#FM#Q:L[& :2@NT X70NA('Gm/8aPF ##3mSl c c$ 2#"&6."!26q}np}~MN)N|NRZ[QFNXX$ "3275&#3#3!5#"&6325!FPPF_&$n7Np}~nN8Jmmbb LL&%/%4.#"326=332>%4>2#"'#"&c-EA*x3:7,T/3(4,G|{G,$<=!`0.b^`:T1 qsIc9!"85H5)JU=('=SL*Fh4ZZ.8`   UM   7>53#5#"' TTTM$C( IJg'_;3 &` 7>53327#"=#"' TTT&  $C( IJg'Gm;3E8A #3>32ATTTM$C( Jg(_;3E&A327#"53>32ATT& M$C( Jg'Gmy_;3Tt 3#4 #4&'T T""mm!%%8. 4&'#54 ""T U%%!mm6 #'##324&+32RCgET,@![6%[wHL 0/#.'6   "(0332654&/.5462#&#"#"'327#""X5E7C&+N]InbXf3<.3PNFucN/& k/7-%" C>IWTMT+$# E:LZL'G&#"'532654632&#" &A: :^5mG'8?E&##"'53265#534632&#"W &FFA: :8DmG'@D-8?E5&!4#"5632327#"5u: :A& 5E?8'Gm& &3265&#"4>324632&#"&'#"&\#(0#<"#M/8 31A: :"SGVLg  *5 e8?E5 HpI W&#327#"&5#5353V'14GGS DF+(ODF !#5#"&=#53533533#!326=K%P:L[IISSNN:2ANI4,NAxHHW/8aP "F *#".5467#5332>54&'531?';d>Af9& ?1nH5%N4,E'5H&};54&'7714SI-F&5Hf1?';d+(U/#1=+.t3&};54SNH9rB4+Ht &"_6)``KxIJ->5   q #"'332654+57!5!4YamXHHEN0 cXexMJKCKIJ4v )4&'#".54>32654+57!5!"3267&,Ya!%nI)</8  '0##(-G E cX H /2&&*5   KIJM$/"#632#>54&L9XesC8T_OCxSEh[9f,A8A/.#"#&'.54632=H:CO_T8CseJNA8A,pJf9[h/ 40+4>32#.#"32673!".500GyL+_^Wj{mZ``!KwG/d2bjO4NNej3Nh`1&&2F "$#"&547&54632'";#"32654&nzcrVAp\~^3?10)5+;=6OG?ZLV&%KIW|/+$!5L6%-_msY[ *326=#53#'#"&54>32632&#"#.#"vMb.`,Lln$8^;c;N :V C?UVajUB=HV|#HO;'27E533,kF &!#54>323&'#"&73265&#"LS/8 31S"SGVLM#(0#<"#ii*5  HpI* &7 NF| 333FT @L&F $"32654&54632&#"##"&54632 ETTEBPOU<9 S9ihx|hgp[\onZ^pI9>ES/"#6323##5#535>54&L9XesC8mmTii_OCxSEh[9fHHX,A8A/.#"3##5#535&'.54632=H:CO_iiTmm8CseJNA8A,XHHf9[h #"32654&%!!5#"&546323 DTTEBPP'E$"O6jz{fl5S!p[\on[^o?JIE1+}QI[q*6#"'732654#"57!#5#"&546323!%"32654&Yam5I7)ENJ"O6jz{fl5SDTTEBPP cXexg.KCK=E1+}QJ p[\on[^o 7:"32654&"32>54##5!5#"&546323!354632 DTTEBPP &"ISNH"O6jz{fl5SrB4+HV#p[\on[^o   )6)``E1+}QJ->5'^1732654&/.5462#&#"#!"&5#53533#2H&+N]InbXf3<.3PNFvb05GGSVV6.$" C>IWTMT+$# E:LZ+(DD &#+#"'5326=#"&5#5353354632&#"#32 &s14GGSA: :S^5mG'C+(DY8?E7A#327&54632#.#"354632##5"'#"&5#5353"32654V a.j[mT@4DMNFB4+HSNHP: YM14GGS 7 DFib]7;ob]j->5=6)``*+(Di   90#"'532654&#"####5354632&#"3>32JF &:2@NTSFFA: :#Q:LZ58G'/8aP8DY8?E5RX70NDz(7#332654&/.5462#&#"#"TT+F7C&+N]InbXf3<.3PNFuc22&5-%! B>IWTMT+$# E:LZD- !!3ET$ JII_-/Z*)Z*)wh!#5!#!#5!#FFFFhCC߉CC: 4&#"563232653##"&5l& C)@NSS%K8LYN'Gm(70aP!80'MB&c%327#"&=#"&54&#"563232653 : :A%K8LY& C)@NS\5E?80'MB'Gm(70aP! 0K) 0) |M)&{U)pUpfp>=3327#"=#"'776  Y,1 K0Cz.GG(Sr \qfrZ);q\)1 1'  W #5433ii#<x&&4W 3#5>=#Wii#<x&&4W #"=<#ih4&&xC_<5OC "3"&546$44,,4$#45"#>32#5>54&2%9IEBK,$7>3+6-JKC<%B u*%*5.#"#5&'.54632(/&+3>7$,KBEIg03*%*u B%3#'#!c&MN&3>dM-O33#'#t_`?QO@``O2#'373_`?QO@O``LQw.q\P-vPCd#53HHt/qS7$C=#7jg"/qL"qg"3g~?"rz_!{_, B7533!5Fx۷FF BtM' nB %##5#53533ByFxyFxyyFyy B-!5B-FFU< 332673#".;T(0; $<4B" @sd#5hhh=1 2"&546"2654&,>?V??+$>,+=>+*?>93 "&546733278L3.F7'H%04*$:,6 - e?23273#"&#"#>[X :Jd :-%%h&%16N\3#%3#=q<q<䖖A:57332>7#"&'JE/# -*-NcKN&r-_UGID0 ?q):rO)1}V);q[)65)( #!5H H( #!5!5HV 3H( #!5!HV nHj( #5!5!HV H3( )5!3bVHHH^3!HHO_HHf#3!HHOfI86gQ. &qcq1. 37dM&.7d#.b$/c:znkn'kkl'jje cC|nAMA3##PHH#5#5HPH 8B53!53HHdd 8B!53BHHd$M!'&/76?M%33%h +00+!PCPvOfe|wq=us!5sHHUx&dydj4}#532654&#"'632,, %(04F@ 2&$31zO3}Og1Ly#53HHLL&L=N#'##'`<=`<䖖U/#ycxU x1)G +2A 3#5265#X/)-I+/*,A #3"&=|-)/J*/+I+A8C8v3#5#53HH3SH5G!#5#FwC +53>54'%-I+8pT  &xs$853533SHSHSSH8##5#5.SHS-HSSH ##5#5353.SHSSHHSSHSSXdwM}U&- '3#"'53265SS &-mG'&X- 5327#"=& -y'Gm[Zy^jzzrW 3+52=#d4.77Lg8A&N*zi3{ E;!#5##FFx8|9kew.qIq9Ch3#YLLhC3#YLLZzPw!!75#}'D}}R4632632#4&#"#54&#"3%&'$3,,%34$3 ''7'7N __ `_ __ _GHGGHGG!FR5654&547w61%&h%%", g7 ,  eMcQCP\|2AXV[@Q/&,&Hɻ3#5#=S]WS#7&#"#>32733273#"C+ :-!%'>1  :J4G%16@T%hh4#y0#y|cF=,#|_| G  Y #5'67&'9 4.8+ A , -19% 5 !c:M'3 #y xuPQ~j#~P{$`& 57'5%3#'#鼼K!c&MN&uJ:;;=_/|%yJmR37''7'7/PQ5'./&4QPDT,CFFC,0Ib2>32#".1#"&54>32>7".#"2654&#"W   & 2$  $2 &!  *    1   "8   8" \(     &M(&     " 37#7#A%9?' e_9N267>73"&'.'33232653#"/&3C+WL**,"C,317 =A%*$FKE +); ?xNU+ 5!'7'7E%9YY9%E.?3@?3@9dDBQ:JHCQ?UL?Q:HRCQ:L XCQ;^FDQ:VXGCQ9XPK:Qm7j B@82>73#"=3 !1JL*OQO,nm sPDdlM  3#'#5!#5Za:SES USSSS V #5h hh&#ze '%5&'se" D '60"F$Oo%R6!#!6|`{5)3!bt{;Ze(G=S+&!5!#"&632%"2654&)Pt菎@R1VԂ򥤄d,O.3#3#tcxh'uK0L1Ac !5!!5!!5!S9gI"SsSaS&2P!#!#!^^0y[i3(^ )55!!!^tU#RRQ7 <%"&5463532##4&'>={|Q}{SoVWnVon_}yQQx|_vVk c r{ lUYq;4%##5#"&5;332657"^"zvZKWVWKZlaaQA7AQ7kb4!%>54&#"!53.546323!;D.qmiMOZhTL /MwAqnc#LH.ei,H##j' #j20G#>'"{BJ#D8+"F2"`R0G(4>353327#"&=&5#"4&#"3260 1S4o3H +%#_BxRBJFHN!CJ9%FRW E  8Nni[f2:)4>32#"&'#4&#"32654+53262*Q;_iho_;F!VH?4;)qAE2*?G7RE$dXw%_w$3?)jTJDJI: #5&#"'4632 V $.'v F #7~$-74632'5!! #".7";27>54&$v_    y =A1FRPD/ %RsHH%$/$8]gO[]]5Rb'$%#"547&546732#.#";#"267 mgffpf ch LV;@@..?AHrXPB_`Q?CO'%U/(;(/,(%'&>".5467#5!'654&&7L=+gdqED&L" .T6BH<@ℎ.A7aE!#J4&#"#4#"'632632'.>X  $CaR[Xn{lLH6SU.v8 7327#"&53 .,<@XQHE< !##373l>XXr < ".#76323267#".' #  6 !$0!! z`') R !0:JFb\<8"&'#332676=3#5+6XX 8)*=VP; "x##*17j>%%  Y>/%2'654&+".54>7.5467#5!#";#"jI'J#&8Ca1'3"6D, dt*@LXRnJd^F*C=^V"!78.H) K9+HFFT0+E@RxD$RR %27#"&5###5!#$ 0.,^F(@@ >0FT:FF28"4>32#"'#2654."20B>!r>D+Gc5X>\11410/1=_8% wlm&G\l8Q)*RpR*"J&4632#4&#"'>54&'.'."tc|[JB01(H;/H@0Z -(FI2.9vu_@F'L4.B%  -<,n P %p"N4>32!##"&732654&"",KO,@qsZ[=IOLLMo9RRf{|k[lZVpr "&5#5!#3272I1! #CQ3II+O 2 7327>53#".531S<# XjnEZ.XbHD<$~V:H7F.8 #"&5467;32+#54&+3267yZF*3CiNXyn X]OK] nZ$D!d;NiŘznOhf ,<+"&/#.##56323327<$=ah   B `Ã$ 3&hN<$*8l %##5"&53332653luVtZGUVUGZlljn6YQNQY$'%2>54'7#"'#"&54673>=3.4(4lP*F$<=!`0.b^`<4Pl3:7,T"55H/u"NFh4ZZj<)lIc7 "jF2"jhR$#L2"qR$#V6-4"34&454>323##".'33265C# $8$,! CC 1L24N, P>-AIGSJi 46_5D# " 3'@*#HAeX8 &8SG+;^@v452>32&#"#54.'&4Df>! PK> '&'@2&`.&-`3ZQ3^E$. 9\xETp_+4 "]4#j]98!463532##5"&73"4&#269Xz?nJXzTa_b^_ae[uy8^M+xSk|oOSki$+%2>54'!3>=3%##"'#"&5467#5.4(4NM3:7,T#>#$<=!`0.b^`!>"55H/eeIc7 ߞF0y6Fh4ZZj(3F(  2733#"'5326=&5#7654&# cgjϐ &Ɣh:ka Tc}NqmG'OFc8*0!>3273327#"&5#7654&#"Z1;Ocgj-#/,6]1=Oh:%.+(9_e}NF9F.4>32#"'3263"#"&572654."90B>!r>D+Gc54)-1'-Dm>\11410/1=_8% wlm&GR4Rl3[\l8Q)*RpR*&a0%"4>3"3# 1S4CFFBN!CJ9%LVLBJVP[&|CP[&|jl2+53254+##5!#)J[ 54Rc9B]WE,? BBK9PPP9#jz0 .#"!!32673!".54>327^W^x lgZ``!KwG/0GyL+NNsR~ej3Ni`12bjO40m6d,#j,-S'!##52>=!32#'2>54&+,F.%ua 1>M@{Ch_T,^!DNteGtY^rR+48FS!!#3!332#'2>54&+^]1]|w` 1>M@L;uZ\rR+48F2#4+##5!#)J[]B]WE;9PPPn&jP#C [#xSy !#5#3!3P^v^y'$Pp%#!!!3 4.+32>p-Y=t] 8''8$FE+R.*,-Pp%P93#!!]tR"y %!!>=!3#5!#5KE*[PPR5hv ٥qчP[(  # 333 ##nEt]tEv]Dwb44D0m1%2>54&+532654&#"#>32#".'3V8N%`ClX?_YJW^X~xi(>gA)KN8%X+U;*).TR[.7DMGkwscl-1}9=. #7\<64P 33##PX}eXi['VP#xPn 3#33 #]]1oz|2M!R!#52>=!#,F.%^RDjaV-^"FPvgG'P0P+.2P!#!##^1^y'P^30&Q7 [3#733qqo{0-#/;32##5".54>;532>4.#" &CcF3'?6K._.K6?'3FcC& _0H5''5H0_0H5''5H0|7jH6W8( ^^ (8W6Hj7]%JdJ%z%JdJ%;Py %33#5!3#^CP^Rqчy8"#"&53;3#MX]L]]\A)9t'P %33!333^b^^R'yPy1)333333#o^^^CPyyq 3#5!32#'32654&+Dd@RQARxfcRR=@PP %#!33232654&+#pd]=@RQAm^cxfR=@Ph'Pp %#!33232654&+pd]=@RQAcxfR=@P* 3267!5!.#"#632# `Zgl x^W^_+LyG0/GwK! je~RsMO4Ojb21`iN3!P#"&'##33>32%"32654&v^]yr|}rq~|aŗ좡^ 463!###"&6;5#">vaI]oneqQ7>53"32654&w,oq}np}$F2?)/J1%S(:FPPFEQOFLU  ( N=mmm\anF %4+3265'4&+326'2+y[*1.;bb;.DRFE2.TGF+$,)P4Q"5!3#5!#573#W0"S@FnFݬ@4xx t;&H 73#'#5#'35kjSjk $#732654&+532654&#"#>2#"'|5E6@;+J>01<3fXbnAVuc/7-%6L5!$+TMTWIK%&VLZF 33##FTlSm ccF"xvF 73#'#`jS   !###52>5lST !2  b%F$ 33###FhhT2T FkCF 3353#5##FTTTT &RF !###FTT @F&S&F$ !###$tT L@& \&&;&2632#"&'##"&5463253"32654&!"32654&-dflmd1>#S?5egke^1S@CC@CFFdCBBC@CB^#+-&^lll\`nm^_lk]am [F$ 33333#5FTT=F @4x0 3;53#5#"&50T"TT;V B9Fn %33!333TTTL @F )333333#dTTT32#"&'33267#53.#"*m[j}k^pTkAM I:4@\\ck`~^TMIP;7F#4>32#".5##3%"32654& 1W7q}n7W2! ^TTJFPPFEQO51D8'&8H> יmmm\an 4>;#5##7.7;5#"F!@,TEgCR[[*1w/0L=F+$&&Cr&&jy]'4&#"##53533#>32#"'5>5B*BKSTTS *;#KZ7PP 5{\70bNT@EE@!JD?k@#(|\F|"j&%#3273#"&54632#.#"3_MAkTp^k}j[mT@4:I T^~`kb]7;PI$VFL "j&M  72>=!32+##%#32654&SqmkaF'B8||:81P,yCXEVa6,+(F1 !#5##335332'#32654&TTTqmkbk||;72 BXEW.))4&#"##53533#>32#B*BKSTTS *;#KZS\70bNT@EE@!JDF"jAF#C&"xD\F !#5#333:FTTxx @!#&53>53653#&'6fKpdFG-*6dBKPRd)EB&f[38~ٹTW^둕o߾@ӽ 3#&3>53653#&'^Rk31RkdR^C#"+pijwy<5*8l U0 #"&632.#"!26^pm ԌaVԐ}|Fu& 2#"&6."!26q}np}~MN)N|NRZ[QFNXX'{|'* ''7'H'HA$''#7'57'573@87;?K7MCCBBc 53353#5#HHHcCBU+<`@ f4@C"#46323".}' @[QJFN (N>~ '$I]!)!;  Y&F'FDy'Fy'F3'FF'Ff'FF33Uk "/<IT_3#5265##5463"37'654''&5477#"'7327''7632&#"#"&5335532#4&#X/)-YX/)-?3 ?3 >4"  >4" I+/*\I+/*JI+/*\I+/*>4" >4" ?3 !?3 X/)-ZX/)-Py 332673#".333#5##;U(0; $<4X}eCPKiB" @[qчVF- 333#5##332673#".FTl7#!#53533#32&]vaYY]\\1M+4^rFxxF| %4+3267#!#53533#32[)2[UF>>THHvphN* CS~FHHFKLP^ 654&+327'7+#!2KC62L$0]-lu<:2!6a@TM;lhys7U^poo@2?2CNO^P993#!53!]]t`Fmu353##FTT i@ > 3###535!!jj]KKtFYFR ~ 5!#3###5H6DDT>HLxFFPR93#!!32+532654&+]t\]]\40+55+RfZZfR/-'-/Fq 26=4&#"#!#>32+)C$*=3T'A9I>YLF079.[Vd L0'IFBM y%3#5### 333?@P]nEx]xJчDDwb44* %3#5#%#5# 35373JF!Sg0kSk@x*3g:%#"'53254&'.'332>54&+532654&#"#>32gv6L80%H!uX+U;8N%`ClX?_YJW^X~xi\x "7*4 - 6% t64*).TR[.7DMGkwscl-1"32732654&+532654&#"#>2#"'53254&'&'z5E6@;+J>01<3fXbnAV_S6L80%H!/7-%6L5!$+TMTWIK%&VDX%5*4 - 6&Pyn%3#5##33%IP,]]1oJчM2F %3#5#'#373@F$SS`@x P'#375373#%#0]]0FxvtF)*MR?F 7'#375373#'#1SS1FgkgF) 1k%gqt* 3#3 ###5353``kxdn]UU]oF;D)Fj 533#73 #%##5ASGGk0gS<..FjF> #5!3 ##Dkxdn]R;D #5!73 #%#̸ k0gSLPy%3#5#!#3!3CPQ^]v^JчL;F$ %3#5#5##335332+9)C$*=3TTA9I>YLF079.[Vd@ 0'IFBM02?"&54>3"327.54>322>5#"'7654&#"c#K^~{mm 1:1JD_cz  J-T741?Ls6/%+?ƜPyFR0HZBui (!*wKnT-fK8y&p%."&5463"3263&54632327#"'7654#"vt}KiFL ?[4AS< ;: KA6.-):7$xM^fuaDegjeOGC$&Dh+hvA9d03,#"'53254&'.54>32#.#"32673L80%H!Hm:$ 0GyL+_^Wj{mZ`` 5o*4 - 6&CUlL"2bjO4NNej$&3'#"'53254&'.54632#.#"3273jL80%H#Xfj[mT@4DMNEkT\N7o*4 - 6&qb]7;ob]j~Vh $yQ %3#5##5!#bCPP32'Y8?R01f#TvZj~PN3*$+: " c0L0# .MSW4K%iV`xU>9A-'!%+m&=0G"/;r <.#"#>3 !32673#5.=.54632#4&"3 &C-Vu_ 3>Z4,{jW^_(HAg>)fgM?7AP.C0!-9"f[ :17'MO :Ne\.uSN];7 4*6B$;/6%3273#5.'.54632#&#";>32%!4&#"01f#TbJH[lPN3*$+: " c0L0# 'X9?R4K%iL^ nU>9A-'!%+m&=0G"DMSWP#^' #x}#xPR2+5326=4&+#33\]]\40+55+]]kxdwfZZfR/--/;Fq %4&+#37372+5265qC)lSSkMLYYL)CY70 MBzBMI07 y!#52>=!3#5#,F.%GPURDjaV-^"FPvgGqч !3#5###52>5dS=FK !2  4x0)CXDG.PAAqQDPR!!#3!3+5326#^]v^^\40+5L;9ZfR/Fq 26=##3353+)*ATTTYLF07 BMPy!#3!33#5#$^]w]GPTL;qчF% 33533#5#5##FTT=FKT 4x=4#"#632>3226=%!4&#"01e%TvY88e;L\s3$vp Tʀ/\6;W1FZgG86&P@?R4K%iUak:4TGQN N]R&,&9VL0Qe  ,('-GYWP[#x|&"xr/ #7326?# !654&#"#632 &C-Vui/GwK{jW^_+LyG0!-9"f[h1`iN3eMO4Ojb /#j' "jp( #j&}#j0m#j~$"jJ Ey(q 2Pg#iF"ivP#jF"jx.#j&"jw0&0#j7&"jm8*#j$"jQ [g#i&"iT [#j&"jV [#}&#} 8"#j0"jXPy9 73#5#!!CPPtJчRF| !#3#5#F6=FK LxP#jFl#j0m1%2>=3#".547&54632#.#";#"G;U+X%8NK)Ag>(ix~X^WJY_?XlC`%N;46<\7# .=9}1-lcswkGMD7.[RT.)*"#%3#"&547&5462#&#";#"326sXcuVAnbXf3<10>J+;@6E4ZLV&%KIWTMT+$!5L6%-7RI!#52>=!+53265,F.%^\40+5RDjaV-^"FPvgG'R\R/-q !+5265##52>5dSYL47 !2  BMI(b%&4$&T : ZPn3#37'373#'#]]ru2Ko}hu(z|β](K}U MF 7'373#'#'#qXu.`Z`u ljS qH.YOl F%2653'#"&53YrO_W;[ 1z^&:Ipv]De$$c#6"(Fy2#54.#"!!#4>aRp=_'O=1D&/_&>e-XlIRQ:LA)LE8];ZR4<&%##5#".54>3234&#";k_?_1:kLBd9# n^K5J*/@U8:MZ5$*:4TSq=RR_ #K:rO_ 8m+VmL^8HC"pvQR/F^<+Fy%26=3".53!!YsN_%=dDSr=_/ %:LovQQ9XR6!+XlL] 6"*2.32#4&'!#5332>54.#"3!54>32(4+{S!$YZZ ;[O:,GF"YE]E}Y:hH=! 37,BvI=Y-siQLud65}F %#33#@`OOMFy#54.'"!!4>32y_'O=9I& &>eDRp=9KBAM9W;ZR4-WlF 3"2=#".546;54&'#"#4>;23#E.4Y_5pQ8Q-Wx?U,1_.KL)i66p8^U8%AC''>7$iBAE:- :U+q\KNA|%"&=4673533#2675#"mjm\c`EHAE[po^~\oK~:O=QkFx4.#"#3>32#%I8Jg ^b y/Ts>^8MA45%:"-ZlKGF^333F_^F%2>=3#".=##33$#-+_Tp9k__ %II,`K,YjL@9KA #".3!2.#'#"&54>7'"=4&#"26v\^$ A~'8fC4Qkpk`Fy%".532>=3#5dTr>^$G2.C) _a \,XmL)4C'!">.)L$42&'"#.'%6,%' /t-g.0" 82O/8"'54632&'"&54672>=4."327&KD[_oteV I/(9OFA:$55?U)2#5 2*WG=BXo?c< ( "''K*>C+ (Y,+D%0#9A|23#4&'"#546.ja=QCK_q\@K@F3&'7672''"j+;?)/<  ?BwC,@<+XA 13/ `y^,G  9=C5/2f (L_><%2>53#".53\8J%j>qSRp=_NK BL7]MmV*-XlIXvo-&4#"&5332>54.+53254&#"#4>32)Bny](2 )##!5-X45G`.[?5T2! cOds{S!35!-= Ms:35,77"&31y ".'#53326=3o=&9%sN_< 'UmQJ^X!6")ovIjY(,467'5'"2>=3#".5(nRXK*=)`q;_8%MsTaS[R[ F2@FY%7A3Fy#4.'"#4>32y_'O=9I% ^&>eDRp=b9KBAL:c;ZR4-WlBG#%5>=4.'"547632G-JT-n61!GW_@Ks>c5$ 32t_,+'a^&>eDRp=bBV0 Z*+;ZR4-Wl-9674.#" 632#4&'!#5332654.#&'54>32 )*HL+0L, _(4+{S!$YZZDk>gI)n)>iB2K?:UH?\."3A5]thH=! 4793'4Y#GP<(%7F3##4.'"#4>32yKN\'O=9I% ^&>eDRp=Q9KBAL:c;ZR4-WlFy%2653#"&53YrO_:sTz^$GIpvbFh\0c(3E)A %".=332>=33#5_Tr>^ &:&.C) _Z \,XmLed !9)!">.)^$-g.%4.'4632#.'"#".53326 0M^`O6kHl4[VRJZ2Oa`O2qFnB+YHi(3'O9\i(5D&C>75$0)O7\z 2D> ?Fy#54.'"#4>32y_'O=9I% ^&>eDRp=yx9KBAL:c;ZR4-Wl<9(34>32#"&5332>54.#"'67&62654.#"O.bFX)Fsq]WI)-"#/$h#jJU[RxP1;!: 9<$e% kNb}w`?M6#%95A `@79(3FY33##F__Pu-'-%.54>7532#3674&'\<^E42D]=^;\L8!9@H4^,=/"^ob0,?tIGp>,77 (?vL54. =E2"n)OM0!3C=eϚz '?pI~5;5#"#".533'".546;32C/,..--Ym")flAc7# ]-48#ih_.j~0D ?+hGG_{$4-mp ;)X=pbOC_5 53'65=^35mfP9G"NL73X7iLA2>32327#"&#" 6=,0../8%x"0705PC L14>32#"533254#"# #E/:C4*U7%Hn721?/,3a)7e*=3'?3! TJQ=2TP7A !%2653#5#"'#"5332>53(E;XOT4t=cX$8()X*B_ZI$0[[h?@ A.19<F8%#54.#"!!#3632X &KXO323##4'"#3 !BLddXNGEXS   D>>6\_K A%2=3#5#".57!!WO:k$9% XQ/AaJU'!1BDG#8;7"&54632533#2674&#"Wrqf7GRc1HC:CACEAmu+6g;LTitKVtrFM %'5#33#&LVJwBA8"!!3632#4.#I_O323#2=#"aEBHYB=>:(? VNT%B^+)(PH $G^JC>XA79&7.A,"$81P=#"#mbYbb}_1O. '4 z hDfz%9KE"FQ;F8"#3632#4&'*-XX>]dOX4"H3GhaI?>F8 #3X9eF8%253#5#".5'##33XO9l1D$XX+?"JV%D7-}BF#$#"&54637&'4734.#"32"e}~P=U3;^+ZJBIy\Lvu*C=64(2@D8I1ce[mF8%2>53#"&'3 *-XX=_fKXG"H3, Eia ~F"#3632#4&'*-XX>]dOX4"H3GhaI?>#&42#5#"&54>74.'47332>54&#"  KVM D9dx1HJ>@D)HEF*: H9=R- _?3v4bH;0 -. PUs.J8Un}A8.23#4'"#3>8)=dQwXRB*)?2\ W$,747'767!%4&',@1>fh1':eb ()#1@2{T0'F],IT=A-4.54>;#"#5#"&'332>7u+3+-,MT6**T) !!AQX$*,: 6&@&$D%&+9O8G6-+2*8 2>53#"'7& X9I*{ !^X KF%273#5#"&54>;"_XPWOAQ%M3A_@1?FS]F49B-=7>#3(3.+53(E;XOT4t=cX(()X*B_Z,$0[[h%) A.19<&7#5;#"54>54.54>">54&A].7*kƅ%+%!0/!))4 9/%%(9.GB#," "?H0#2-$+L4.G) JB@!7(*@)79R&ERA72>4&#"#36323# GD:4XO%2>533#"&'3*-XV=_fKXG"H38 EiaG~A8&%253632#4.#"#5#"&53U.&/ LXpaHSTA8"#3632#4.#XO5#"&"32654.#wj\;Q "1J/0<'UA1)89Wiu5W.-8V-/sJ?:)>*/ ;),.;1-D?`f;V*ai7R+F 3#~ 6B A88)%2673632#4.#"##"&53M;T32'"254&umQ15VddQ E;%HG+4LE:@g}ABLLBFA47kvU_HfV^# %".54>32"32>54.+NL. 1C>!m"1E; 1/]<2/01 9pM>b;&wDh:$ +U9ka-U98S+*8o#+2"&54>;32##5#".533332654#'35"Ia!=I/>=Yl*:7-W/(9/!NW%DD5638PC*; ߆i<_9%7#JnlS-%!F ".53326=33#5+> V%*GHVO>-# `-+KDBR$Z5353Zdddee^dd &27"':'0AU+Y  " P&f']&&&zzn&W&&__ }P3# GG3>Wd 3#GGGFn  :FX##5467'36=3>Q;f&,WPJ[sCVL(CJ)LLX%#73'.#52#BuQ3G36TC82X˧2C L,V9&X#!5!W  LL?:X #.'#53@{lWAZWXamtQ: Lw>X33>WX'(X##5!WW  LL?;X 4&+#!2#aJW\Wt=[X}a=:X%26=4&#"5632#"&53?Y Rzd[Zz5c:X3:WWX#&8X 2#4&+5iWaJXY7>=!53!!'.2W%,4 [W5V+, *bD?Rn(*@5?;X 2!4&+wxTX_X+@U@0:X4&+##532!53uWA:X:N{wAT L`L>8X3>W 3FX 2!534&#GqRVX^L(>Z=9X  "&5!24&+3265ڑtWWTWPL[[zvhrJN>ZY?$X737>737xYs# W +C:C  &!X5:9'LO98 X4&+;#"=32#N]y,@"(~}WtTD1Lsk?X*2+532>=4.+;'.=Aj=*(GqA753 [UWc#WKc/6 +3X!5!3>=3 f<&Fd0-W@jL 4'>8&X#53>7!5!#&l|>7$5#ooWlbL)Lr%X 2#4&+5uWO\XuitNJL<X6753+;2653#.53bWpFd x>WBW{R}W,YG^8\nLRXZW#{X4+#5265#5!2#$ityMI<yWtukLDM/Lqm>jX!3!3XXXX<_X3354.'33##:D! U ;!,kWHV,,54'* S*IC25^H7Z,MuG)5!5!5!ZXa #"&547'!5!73#".5'2632 tmM 8#&'f Z-=Z #}a%#"&547'!537373#""&5'2>33 tmb(M  6?'f #Z-=Z#} kq#532!5!4654&#yyB\oF(TS 1)Z a Q/k2!5!4654&#\oF(T 1)Z a Q/m".5463##'2654&#"2>+_UdY /\&44*&>9'X<_,EX!gOI14XY+6Ld !"&54632"3264@bz|`ay{1bNQ43J~WZ|}Y[zQK/2KHbV[s.54632'>K"2X ): 3_2@(HdfO"!#'#'!53547O$JzppssZ\r_ '!5!73#_J.DZ,>Z__ '!5!73_JZ,>%'!5!5jieO`ZS #/;U2#"&5462#"&54632#"&546'2#"&5462654&#"".546335'##" ! K" ! " ! K" ! h&44*&>9.2>*_Udj[ /> ! " ! " ! " ! "NI14XY+6LO)V;_?ObD,EX!ga(%#654#"%632Z\@DtaE\I;@ؕWHO]qZU;I@np)5!7pHfUJZCkv )##5!5#=SO^Xk?ks'545):5-AASXDfm(hj7&$ "&/.(# #xOaI8UZ-_Y+M Y :1 0#`n2"6E2632#"&+"''7.'&54676>54&#"3">=4&5):5-AAWT<  "dH*h "  7&$ "&/.(# 1#xO_J.2 H+".1` +M Y :1 0#`(2%#"&'!5%277327kF3C$&8,A(E,71D1Z)m+>CK@ %"&546?!5!'7327SdVF9? >"pA0(F)OL8F3Z!."$@ #"'!!32654'./;Vd%>  ?)F(0J""LOZ@3*$"$#!5!".54735'#"&'i)t6/i #% W||W Z8V|9_ SI>O] "J?<9!& 3"&'#53!'5#@F5AdGUdk`#532!5!4654&#{{n\oF(TR 1)Z a Q/!#"'!5!'#5!3/\  ;;ZZYck%"#"&54>732632&\ n69KN(Gn*i :((/C9Ee*lSJ*+99&T''7'77''7' &%Y(,$"5'=d+jA!577''7'77m &$Y(+#"5(>+jA!5,O3#3#,####s*/'K7K/'K7Kq5 2#"&54'2#"&546.! !n! "! ! ~ ! "* '7''7'78!8 8KK7^_`]_ 77'7!9 8 8KK7^_`]_3#'3#r####K}/'|KiK@KL[ 535#53#3HHIIL"< <" D 535#53#3 HHII"< <"Ov 2#"&546>" ! B ! "6{ 2"&546/537$/++U y!;9 2#"&467#'7yi.++-$ w";8jv 2#"&546>" !  ! "fq#53qbb]jv 2#"&546>" !  ! "Ov 2#"&546>" ! B ! " x 2#"&5472#"&546).! !7" ! V !  ! "w 2#"&54672#"&546?" ! ! "! ! " ! " #2#"&54632#"&546'2#"&546" ! " ! K" ! t ! " ! " ! " !4632#"&74632#"&2#"&546"! "! ," ! n! 0"! 0"E ! " %N,`H% RHf7!#7777''7''7''7''7'$"$$#"  ; ; ;> ? ? @ @ ( D C C C B @ B A V  )3533##5#6#"&542#"&2#"7#"432V'SR)U, , ,  OO%QQg, z- ,J%J'72673#"&'3&IDI+FIoKLnG*!AICI-6N]_L+>M'7[TZ\T\?)'&&XQ23275#5354&#"#"&=3326323##"#"'"&'73254&#"'254'"'4>8P9T"/hm! o(8A]5DLGJ)J;.)5PC*,HG5; 3IeS32: hVJ,/eE.;-)5PC*,7AHI3;7\):Q9W@ II A*(<e@23275#5!####"#"'#".'73254&#"'22674'"'4>32.'"'46322674&5XN4*""&R* XN4"ZH39 "0d-'D",,5)NhkM62 ;$F_vE] `IIM ; ,R?8"-[ 8+Fe+4&'!5!##".'72654&+'326 ~Fr+7,/hK(N<9'!?*Ed072D0aHDEEIIC2A(U1OZ';PIL+&dd3&4LI$e=2'>54&'"#".'72654&+'32654&'!5!!6{325!5!!674'432")::PCJ7(J,b %-2 VF5|{F7 %,?>:R71C *?ԟ;oN8DFIII4 J)!-d$Ae>.54632675!5!#327#"&54>54&#"#54&#"sh2-AuX@Q+K_89'77'*(9';DFd'77'7%&4J2,)@@SDa73cIIf J20Q4+'!=)M;%;**>& )/"FU >{?'gB3{X72674'%#5!54&#"#"&=3326323#'>75##'& *J# m$75##'' *%U<1Y7 M7IIF3 ( @={#2674'%#5!#'>75##'#'7' *%U<1Y7 K;R:3(!/f# r&;A`7DRMGLK(.dF.;%8?Q=2-6BGN/;6\eU:A* I1"!0'M57 TJ MMHMI(;K:.)6PD*,6AHI3:6[eO@A*&I:J ]m #)<'P:3 <7.CI, 0+WD23275#53%7'73####"#"'#".'73254&#"'22674'"'4>:S9T"/h1d?UMGLJ)+`I1;r[SC*,7@HG5;6\eY6A*&I6$J 8MN#P;2 <50CI, 0+e<7267!5!!632'>74&#"#5#"&54>32."#"%H9I8]yFT.#7IH+@m"L2 % #/>(  IIP[9X0m1!,/' $`D'O:P4)4- eA%#".573275#5!##4>32&'"3275!#'32675#"&{";9eE9" < 2' HI#*  =L($D)0/$8X2(94D:Pq7)@PLD%$."-IIX1F: 7Λ&3::%:(3.D e#".54735#5!'# E.(; GH :DII$Ne).547#5!##5#".54547"327!;"6ENIIoW2=*(2.*Vx*IM*^I0%IIܼG 9&6-$P'(/Le/346;5!5!##32>2#".573254#""&#531>6.>.,"9="4lRB$34P_-q H6y__y"!`II1= I 4L(6MQ7."FX7p"]le%2675!5!##5"&547#5!#8e $lGIt5@NEiY&;,`:IIEFb-#46 uIIg)9PCHnX%*-g'ie0C%"#".546;5!5!##5#"'.'"'46322674&7##"3>3232C YN4"HI7T&-'D",,5)NέH 7. '&)E] `II|-F ?8"-[!8+.M ( e(6323275!5!##5#"'"'73254&#"pN*)'II3%D*Ur0INpK4 & II!2&V:Fv95 8e746;5!5!##"327#"&Ag68z)5+6(_3DV{lMmpIIL()A$V*te&732654'7#".546;5!5!##"s(1'FB96LzX6_<"`Hl$ %;#197'1*iP`.HS'De}II#ce/46;5!5!##32>2#".573254#""&1>cY6.>.,"9="4lRB$34P_-q H6yy"!`II1= I 4L(6MQ7."FX7p"e%.74>;5!5!##"&54632#"&>54#"1A+m)2YM>4#5 #:<g>(2.7@,hII>.?i'-4B,& *= L);31`e####"&=#5!26=#`GJMC@U*`[-$?YU>I)1V4e4>3!5!5!###"'.*1'\4GI?%4 !! 84+hIIr;>6 !*+04*e3%275#53##5".'3254&'"327"54>320rahHI!&*5eC)(15.B; "3+K^-II  0FH {)6.0Cs 0 eEAe&46;5!5!##"34'432#&'".*E4H!(F&,/b$In?' &?W`II+!C&1*M >B)93(Qe/%2675#53##5#".547.54632#54'"63"e9`HJ_r$: 7-5G3.CI(1:0S ư89II_ & ;*W*0HG(%0"R ES48e463!5!5!####"*JY8GJ B(%IIOX 8e'^X6Le 7"&=#5!##5'275#Mh*IH*I<7;X@II'J7%-e'7"&=#5!!632'>54&#"#5'3275#Mh*D1E^{E"S955H2;-;8ۦX@II?WDV0j2)&&1#%-0e$%67!5!##5".54672&'"327'M HIA=5L#YF G8+'7.#$ IIܮ/)<0Eg PN,6vBe&235#53####"&546;54&#"#&546.IhHI b )4N Fc/7II c r!/0=e46;5#5!####"&%5# )^HI bg "II NpI,e4'#5!##5#"&'326275#9,HJ=Q`$)5LPD)A54)II5xd ,Q,30ZLe#"'.'732=!5!#dK6 :y3 "'0?;J>O3BT 6")3D[)-).IIhe'^Te%73".54632675!5!##'47&'"s4F?%NN8cLYCBHGJ/b B&1./F$K3!@-Fe0E^GB|II`r*!!(. ,:e/;>75!5!#"'#"&5463232654&#"'.#"32>P >%A,RK^'(`HS\DWR:-"+(( I3)VV' `4kIIn 1;,UfY]gVQh'NK0+<  *Amu- e'^We&'"327!5!##5#"&5467202,.!"B<^I@CGfWHFl9'( <!IIܮ4j?Dh e )&'"327#%72>7#".547#5##7E'(d+yP2./6@,28:.bMGM*!z8EW45( =(*6&5IGe 7"&=#5!##575#327'Mh*IH**:.EʚXAII'&,)e#)###'#"'.'732=!5!5#GK&D 2a,3 "'0?;J>&%,Iw.6")3D[)-).Ie57".547&546;5!5!#!"632'674&#"{Y=_R;AK#K&:!99!;,=09X{7K< *I-98K>&`II ; 7' .! :#53__O]K##".'732>54.546;#"?ZZ?bK)\A+3Z`.)?[[?>3 N +;470W2"'632#"33254k@ 6=S&7 rP\G wBxA!.:)'AS`]L527#".54632#.#"B6.9)(@R.SQ4a^(%42>7#".546;#" &)D;='E9aTC9 <*8%8IG6&A!/46;#"63>767#"32>7#".547&E9aTC.!"&)D <"  ')E=:$C{8IG6$ <* !  ;)6#0#$J;2673#"&'3q+FIoKLnG*!-6N]_L+cEX#54&#"#"&=332632E?# p$L7#-H###53'2673#"&'3MHMq3@HoLLlG1/H6.N\^L%1\###53/54&#"#"&=332632MGMX? l&:B\5CH2 0'M58 \ ###53'73MHM==YH:3###53%7'73MHMB1d>|RH7#^9'39!W se##3MHd8b#53"&533265232>32#"'732654'"##".5732654'.#'2>54&#"'4>{RR}zFR96];P5" C7ECRPB:* %!+Q#(1G( /3(S<29{Q)(.%$>3' 8*YLTqqT6FE7ZAF& 2;2o\Ys1G0@/ .- -@!3HK2!/"3 G0 ()  (.2 6#5D6*2!5!&3,M2.#"676322(1(! 0!R +1$&;<>32&#"!0 !(1(A;&$1+ jJ!!72673#"&'3t+FIoKLnG*!F-6N]_L+e'^9h e'^: e'^x;e'^m@hce'^mEhe&F^Ee&O^Oh,e'^ESDeH%"327#"32>7#".547&5467'#5'%&'"'>325!5!!7'432+ML>88O#7( &)B=<& +4)H+b"+$o?|B-&A-=8:% <*7#5$&>/C )=ϛ9lM7 S]-HH5J* -eZ.54632675!5!#32>7#"32>7#".'47&54>54&#"#54&#"pg0,?rV=O,Jhr4="00",1 '*H="'*E*4)";"10"3$%7G,"2=>SE\61`HHd L3*G-'+/ <* " =)1 8$&>$>-+6!$(%DR"0x@f77.5463267327#".54>54'"#54&'"J& /WA.=6,= %.%"$0&'9 '.'K'6%#.a/>4E*'$ #B(.#, # 9&34"3>'v:SfO7.54632>32327#"32>7#".'47&54>54'"#54&'"J& 0XA0= /&2'/'$#$$  + !8&.,'.'K'6%#.a/B(J*."?14 $,  .+*/;'34"3>'s'C;eE&P{Z] #"&546322654&#"i]^fi[\j:CB;6E@'aigc`kmG>:DF<>Cqe 2##"&'463254&#"M]I#9J\i8!a?"$5egRX7YFI^,/\'26Xe>32'#"'472>74&'"X}/Z}#72<eB;/0SN?5^#.qU4W7 +J4/q97D/de3%4&+'3254'"'>32'&545463226b6A,kpfO-'%66!@&W?P7osB/B1?KMDB  ;(T!"8!HX t0>*ENe#,#"&547.5467>74.'3254k_GE[eZD-?(d,CJX$9X]eDUiWI@OOCHW?L3 B $=]+L ) FKK9ef2#'#"&547327.54'%XML-5Og:D E.- ?I*n[_m"f0G=8^ee0;#"3274'432'"#"&'47.54632&#"V$HZ/@@0 @!'8C8" RjV43_BH!)G(+DIH)(7 V(1'#_K`2K(74&#"3L#fP +! $ WR"+ 2'^/e%7,H_ *  1BY%%/Y*#jQ) 2#"&54>32654&#"1I49:" (,!))A42F0 #n+",!E#53x ;'g)e'^7'^j'^;@,e 4'#5!##5#"&'326327'5#9,HJ=Q`$)5<6#]<2p)4)II5xd ,!,L+,8e463!5!5!#3!5!##"*JY8GG B(%IIIIX e&%4.'5!5!5!#3!5!#".'7326v*GGA.#T97b@% ;>b-#46 uIIII*)9PCHnX%*-g'Xe>32#52674&'"X}/Z}&;?HOmN?5^#.qU3Z<&{A7D/ce/46;5!5!##32>23!53.'73254#""&1>cY6.>.,)P0\,34P_-q H6yy"!`II1= I P/II#hD."FX7p"e(327'67!5!#3!5!5".54672&'"s7.#$ HH[A=5L#YF G8+!,6vI IIIIq/)<0Eg Px#"&'3274632#".: @#,M0& !8GVN#h " +( 3254&#"'7#"&54632V&/"2*$;(1C9%5D&)!6*_1)@42&C"0 !-72654&#"7#"&54632'2654&#"7#"&54632 3%k4&(AA"D_ 3!o,.90@#(8c80$?3;'1080FB,$4@.%!5!##5'#".'732654&#"'632>G3R4C;aA* 3{F(7?()/S<^2 [?33\~I:bi:=-'N< ek={6&'##5'#".'732654&#"'632!5!533##4-3R4C;aA* 3{F(7?()/S<^>   3JJ3:\~I:bi:=-'N< ek9 [?3 M3 >3!5!654.#"#"&54732632'&/32654&#"'>32nX $l6J0 42Q9HR@o'";+*9(EA4*?&547#"'73274&#"'4632>3'23!5!4+"&=33G)..48+5G"3'!=513>(.^J(c>.]:E1+$hkUUkr:d F;#%d1[0N +.N)#,5=33?,J23!32?67#".'32>54'#"&=#5!6=4&#"5473V-BS' 'fP9^8)32R.(< "  7.>f- 7W6E3)2 (/!ZoD_|V'!jwU#3)*%( +-3 f01@/C23#327#".'&'32>54'#"&=!5!4&#"#"&547326h.DU2@S'AA#QE3313-$B'2"<>)%-TSR- ==T7H3"p9u2J%VL^R#/ >*4S:3.8.21X092675333##54&'#5&/67.'#"&547^O>393TT3 632$eo  L&*'"$pC; #8"6#'%y\3j;D+t`N8H4 21& G/3$ t5y;2>54.'&547#"'7>54.#"&54>:F55&8,7 F.6R^R6d,* , %* &-#gK>!+;%4 2J.1&6($*R8Mi*1+ %'/!9-#;.2#.#"#"&547326324&#"327#"&546(23GG ORR,BI>F, #;3O9H_5A@1:'+Sz %/9#LYG#4.#"#"&547326324#"327#"&54632654/&5467LW3 >.DTQ,2BTD.+ #7# %\Z%*IhiIW((/G_A5@1/1+T#x"+'8(0:&9(D$)!*"I>2#".'732654''254&#"&54632/ "2)(H75%)3 5Q]L#".'732654''2654#"&54632654.'&547QP5,"2)(H75%)3354&##5.'7z86H0/")( [63 Eu6")C`*.33.&N4#B%'6MfXOMFX/+33##5./>4'"&54732677W$Ld3443:3:*4(%1( &'=5FaV3R,1-45)*%/DJ+{+2533##&#"32632'>54#"#"&5469M.3443V^!F O",&"'*I N  W15HM3`7#)"5"% O %1^.%27#'47#5!##5./7#"&& !&')At533JN &H $ #a133AAZ (R8  8B>32#"'326?#".'732654'#"547&'74&#"32 I4 '.',69(#)ZJ>g@&3"5R0<3% =!o#>(<$UE$) W<P-JcM|B @ykAE.0,"4!W>1 .72>54.'&'#5!!2#{#bDLgH"L6: G5Yi 33=.(L./:.#532654&'#"&=#5!!22654'#"'%8/$22D"9rGWw%.\30%[ML  C1  ;) %> $@t3\2&?^.33! (/K&Y.@7".547#5!!327&547".'32?#"&'&5332654'(3 KYK9<10 #BP2$*%,SAH3(4&"@(2.a1337'!kmHTjN]X !!# B!-"')!3_x+FS}A) 6'$&3$675!5!33##5.'#5.#7p_ 63JJ3(3+@Y+)Ca,+3AX3=W8?-KV1:CY#"&'#4&#"#"547326324&#"327#".5463267>32'"2654&#"532654&0g,[3EG g!}/69`:, @*  "#! *7%!/,=j7_-X83%'/(240gCI:E9 C<9*#S )5. $ $>Ab!>-4lxE49!,3%F'223!32654#"'632#"&5#5!654'".5473.I;d&!"-:c4,'E<[ #,!*a7>54'#53&5472654'/2CfHFV2 P6&):4I<"G0,N73k*EFHZD N=%3]G54#"'62,'M 35% *>.9d?'33q 6Y1&"!=8[?#327#"&54>32533##4&#"r, )F>)3& 3553Y$5@?3^+1:('c3W+w=&U.+/&54>32#".'332654&#"%5!, 8&KcfS5+# 3  $2BLF57va '" '{y 1&@)I%%7;X/:\IFa!w33033##5./67654&#"32727+"&54624\%jI3QQ3";,C&,n'B7) ? (V~Q8P)YX3I% 58<"*$3- 2DJ.'#5!!67&54Mc3Og,./j2"33!PO_ Lcb-5%"753##5./7&54632&#yR3GkMp^),*' yU-J1& DJ3VGK)[F=8Y325!5!##5.#"c4#4,b333B$&3"&D/F"f33BE--,  s&>32533##.''654&#"72767&#" n6F4==4* $%.% # 3#43B1PE3:H "&!$ 9 ,+2&) S.(3254&##5./67&'#5!!32#"' I<38b($f4R9>(69vKZr7 #1?ZFA_ %M#6@33*8&1,'aOaP'% .%.#'675!5!##*M!~/3%Y*6b++33IX,G5.,0#".'32654'#"&54632&#"326%5!%`K9bC:"9%T,P"5R3O)4! K%3|5 #!9 @s1Jm_:Q?3Z7?#00:233.!.'5#5!##54&#"#"&5475>N)33`#B2U)D>=79.&!"33C+P,],82N.67.+5!##5.')9Ye 633)9?Y7?J"1#9CE33LCR F7'2j."675!5!##5.#754632#"&23*@Z+09twF&A^6&33Y8?., \'".&3"&546326325!5!##.#"4&#"V+8>FG;1.+&k33 3%'9#.%&;0S>@R0+ 33!JL0)56#"'73>54&#"563263533##4&#"327#" 4$E5N3::3Q$!, <X&)-1=8k_  $W3^s/6 +.&'#5!##5./6&'5-~:3BdE*I;0|UL#A33@]G:%3(?+7qc{.(6325.'5#5!##5.#"#"'7326s@5"'2 B_$53 :'30A,-84EK7"33N4?4j" E.#2&/32>54&#"&546'5!6lY&_:&: M$B0dY:o2[p!H9!(# $<"%*9+K33_ 4632#"&"i2".$5!&/32>54&#"&54635-AY&_:&: M$B0d/3NK+o2[p!H9!(# $<"%*9+K{.+532533##L)Rb3BB3.38M33###53'>32&#"BIC3G9* DXV#BUe33:IdNJ&Ww)$23###53.#"'67."&546ц AA3@@f,[o -@Hi)m33Rv$ *!$%H*iL"'2654'7&'#"&5463267&#"0 *:()(0M9< */)?/*8BA9/"9S @$463'7&#"327'#"&B1. !+1( )3&0b)5?"!#&r/%)?+dsj2QG~8Q%) 7'?'/+dZi!j2QG~8l@~8/.7267#"&5467#5! CL^O<&[rD3  :fK$31n5qL,7467#534&+"&47326323#3267#".(GA-Y)*3,2 K@<G>=0 C0H"Q/342H #6M3j@~  :9TD6{'5J4'I/Z'7+{({ 13"'654.'&54632#".'732654+9 &-0 J[g7_G:OC# & /8- Li 4 ,#H/5.PBTA4(84'  >426323###5374&"#"&547c)B&GRR3VV3(B`T*4(,33$63!,7).1<%"&=#5!!>7#".'32>54' 4632#"& %) S(4wY=a9'3Q)=#   * 6(33[%p"YoIg]$$6-2(   4 a.(3"&5#5!!32654#"'6324632#".#4C9e"(Hv!- /733h0C# "mP_-!. '!##5&/674632#"&eW83C,=,E$y/(" !%&]23Lp/8B*5j "fX '&R:2675333##54&''75&/67.'#"&547HpCD960O>393NN37ds42$eo  L&8!$/3#(8,8"6#'%y\3i=C+GT*8jU`N8H4 2!$& tyu2>54'.'#"'7>54.#"&54>32>54.'&547#"'732654&#"&5465,".]," #,* , %) &-# :F55&8,7 F.6R^R6BCT G0 .8(!*4F2!$19"  *1+ &&0!9-K>!+;%4 2J.1&6($*R83W )$8 3 %1   #&$,32654.5467#"'732654&#"&54632R=2GG2 LZL/D7#!+45,$/",( I5'9 &-  #("2'fAA 4&#"326'2#"&54>pA4>I@4O<8DR^IXncK*8. Ml,)%#"&546332654.'&547ls=.A?1   19O+$==* 1EE1Mc09/ M=4/!1 40 +0=b1#%#'&/&/33254./&'7^2a"HC39@!* R'u  H:''*"6E@~$@;#''=.V  *!&#-?,'2#"73>54&#"&54>&/;1!)BD$a3+mG$6O>$1: 3 #4X7A^/z C!*4#Dz%1= &,9C 262654'7>=&#"#"&5467.54>32\>s(>h%:r"B+%3~aGER'D@=&7/43(J/#C.@ $:O0", *1b8JL?'13M/%8 8&+61%23&5467."&546?6?&'>32#".'732654 Z #+) .! cI>jF+3=o@1BL2228* #3-(8.!(! A*ZwEo? Hm]E?`0;6363637&54&#"+"./57"#"'4632375' 89/"NF 6 l6(,x&CWL),*&v=g 4X:7 $  0"32>54&%#"#"'4'76326323;2?*-,;3N#dJ/%,$/-9/'   18#@>/#  JOg3"# >4%>5.'.547?654&#"3"&54632H('E6Q &1$&\xwR:)&:?G;7Kp I4%  - " *#/=pN` 3 0=+!7.258El: . '.+'675!5!##*9V$ %9!~A3@>e X,X.6b++33.!7.'77.+'675!5!##`:,n69!~A3H''%&&Q . I7 .6b++33$X,ba %.#529{M]M/b3=aOIf$ 3#2654'7#"&=#5354'80AA/F-,4_D99VV1$19F3Z/&R*."'<=sJXB3KNba 72673#w63/M]MOa=(K&$ %>75>54.#"&54>32%< 3@" '%*8(1[,Z :3+$'$. 4)34P: <1732>73#"&5463232654&#"&54>32#'"@8K}S5 3AR-2BY., " .9(7, ,!L;h7H# V]nѫ"D8#3(#3'(?=8N/' 73#"54#62i %*L9TG&7N#V.(7"&=4#563232>323#"&=4#"l + 2" *1&3 N?M?)" 34)51e+%72654.#"".=4>321K)! 2,# 1G$#G/98#`P(#3 $ "3 3 554<)"C.Qdt $326?63"#".'#"546326.,O+&?43473#"&53%/YHJX 7,( RlkS%0 wX 4632"&00!H $!&000'(m+82#"&54>4&#"3262#"&54>4&#"3262GC84F.e2&$ "!)C #+C86D 6k.  )("mD86DD8 ${&"3 ( 6%5CC8 #,| ) #'+h>26?53###"&54>5&'#"&54>54+5326766+;džAN/7 '$+$BJ;& G8\>]P "3[9'Ai JE>&9)H+&WI]7/$;"A /X8DaPB26?5!#####"&54>5&'#"&54>54+532>6+;@AN/7 '$+$BJ;& G8\YWP "3[9'AFi JE>&9)H+&WI]7/$;"A /X8 aJt05.#"!##"32>2#"&'67&'###53546323598G4׈iYK$>! c6\w@}}kc43 q-{L:bA!f# (asINagn@A:g)Q783567&'#5!4&#"#4>323####"32>2#"&-{MwZ2JC*@#B/am@_3LcPK$>! d/uA|T[gnAf>H&@;"g:A@>/!f# 'co@"@&"@'"?(h")X/@3>7%!2#"!##".5#54&#"#326} xJ[J0C]=Z5%biMFu'L54W?2! DY- +Z= '9S26F@Q0NCA41 *H8*AXo#Dk64 +EC]Ic>+A 8[0OG(5h"+%87"&54632>7!5!##&''327.#"Pny]cn-p! C A3 .% jZ#  7H7rSXkyEAA!-%3,3M:3"UD'9 $ J#%2675!4.'#532!53##5#"'763%T )@E ikY ȇABcL%0@Z=1 AA54'#53232>54&54632'*ʉA$0EA 3:p <>2SDHJ&)4)! A"Bd#'KANE.J3A'+c 'TZz.}'074>327654&#!5#5!!32#&'#"&7327&#"<>*>\4+B:M/E"_6,E")Y^D]@;*L;KHY+)265-"AAv/.NM1mH4SL8(?L!4632!5!5!##".'#"5!32>F3#<’pZ1MG*9#]O!;1S.?6AAsOd?zY~~f3&.74>3!5!5!#!"632#".54>3&>54&'#;$ 6 -t+o&tnrn,  "54&#"#"&5467'32>7;4=q86:;kb 2 ; (K'' &% )3!W- g\'"'(l*";%=KAAATW2OQ? &8, - 3M  KA!4%2;5&'#5!#!"3!#327#"&'.'".54[ K l>2O+#! ;+)X  @=;xx7AAA$,@ )70  h%#"&'6%5!5!#"32>32zM>k<1&,SAOK#)/#>"! euC!AA )G/3L )%4&#"32>".54>75!5!!wWPu2K, \VT3/[<4(5,0A1 4$".4>32!5!5!#!632#"'&'#"254#"77%!(%EaG

h4:}YK"3# $ u(7AAA!1X-mL37:K}9@(,.76325.'#5!!&'#.#"32632#".&Z<; I3 QEG2$i!HGU Bn0 PiW0W AA#W < @5*P7 3-"N*#".4232654&#"#"543232765!5! 69x$2/6f(H@;mZ*LM?l") @Mq.?e(>% .5?=>8B5/AA"7>54'#5!##5#"!5275!0% `AXeb !Jh >,(,>AA=G!.R=,Q"4632!5!5!#!32632#".5#"[+#Si(~ )Z5Id6H>5RJAAoz0 .+*QdE7>54'#5!##5#"3270 g@Y_b >YEhB-+2AA=3.5fKQ<\)".54675!5!!5>54&&Ay!3%,.PR  3 wm]H1=A.B/[AAY+" A=1H]#732>73##5#".54654&+532vOW75͍@Lb(X@)L%*-H AE((  '7!5!5!#!">3274#"26wEl1#B2% *)A$?Ta!W+ZQ>90MO%;tAA>&!1 &G8;IB1)+*}!*!#5#".'>7.'#5!#!352675#Az&Q^ %5!I?>0m 9_Vv3E32/ (1AA?S-.;oJz.8!".543232>54'#".54>3265!5!#3267&#"*pP6`A(; -hi); $K4^HK-p^y!)1I,=Ij+!1'=*a-'+,JPaAA]:!WqO!&(<74>54&+532!3##!#"+"[giʊ@&)5YD?o?WEAB)Av"4'#5!####"&'76732=35!f `?''D'@9g+5s RAAi$5 m*O|Lq#K_x".54;5!5!#'26=#"t;eH~K7$LZ]i=lAAeYM?0&(=bb&*%2654&##'"3"&5467'#5!##!BZS>]\?T%/! \}iINMGj|_Q|{;[AGY^B%; >}][p AA qZXD 157#"&546322654&##'"3"&5467'#5!##!R3BZT>\\?T%/! \~jHMNHj|_Q{|*!& [AFZ^B%; >~\Zq AA sYXD+!5!5!#!"3!#327#".'.54> ?$'+N +6%8 ;*)H/"+)=xAA.0@.= 1*?5 4% #)%74>4'#5!##!#"&!54632#"&3/.$sA  )z$!Z]wpAAEtv!74>4'#5!##!#"&!53/.$sA  )z$Z]wpAAEtvt 325!5!##".54>;#"v!6U.]I~01;^ 7$1(LDG3`AAc.D"LF #*@]d 2#"&54}&2%57##5!#@dBFAA.#"3###535463298G4@}}kc43 L:_A@A:g*P6"B23###534&#"#4>;am@\\2JC*@#Cg:A@Af>H#@<$@h0#"'5327  Y_cUX^ (A('h0#"'5327#".'5327  Y_cUX^iY$G%cUX^ (A('' A(' z2#".'&#"547=}!h&=!4Z(J&x)$*3!#'|&4632.#"&5432.#"+#4hL=]j&%T*)%(")("2;#M:T\HP &  @2 !m".1&#"#".5432  -U $) 1++/-#4 9)#".54&#"&547232632#"'67&#"2] $I/a3E& C!+2+ 5/)?4&5$&K, 53& #?1&#il8# 10  #.'7; #?1&#i8# 10  $.%2675!4.'#532!53##5#"&'76#"546323%\*q  ik0' ɈAY"=" !32 /^) A[\A33X[0  !*7#"&54632746;5!5!####".73275#"_\Hv@7!5!#<^TA8,h32#"&547#".7"32>54 0W8eh  8M5w-I+ FW#4)29',3%e]')E8/aRb?(0$?2. ,p+#463 #"./&543232>54#"#"i C^!>;h2!^H*l{\%t4;7[5~H2=DJP1+2)[-3?YI.,t9 $ !*))+532654'5".54>4.5474&#"32SZ]`Uj"+GGJGG,!jUNPQN5ZX7Z@"%? ! 5%.C!!C.#3 "@%"@m<..<`3273#5#".54654&+532*$WOMe@@Lc7nCL%*=/<(8HFE&9'5&'&54632&54632#"&#"yH; ]#<`VJ9p1!AO5mY%47CHK @ -(/("=$7@0 G/V" ^F#7" q BO D DB )$< G,2#"54?>54&#"#"546Qi *"9(E*&u8:FhK*kJ66  ,z_!;4,*!$"4-^GN-C`+" 3=YX"4632!!32632#".547#"V*M-IS%/k4dmQ4@2TG@"6`jK1 #=]c j74632!&'.54632#"&#"#!32632#".5#"V* @KG @ !-.#`#K_%/kcR1@2TG%) 0H (*7 ZxB #>^wH!2#"54654'&#"#"&546(; $ ()=1M'%+&C!1#<I 5B#"&532>7 YHIY 8J7 UilR$1 4!&767&'#5!##"32>2#"&35.wZg75F;8L$>! a0nD-{VZgnAA . e# 'boќ *0<.#"#4>323##"&/47#532674&##326@^v7R/ @ &=kFTv8cbLEt'L4Ozy29Z,kaA6Fjn+=5%EO9&5ZW2AZn"Dk65 в$AAQb7[5 Nfrx2#".#"#.#"!# #".'&5#53>32>#"&547#"&54632'2>54#"%3>74.##32>sI, %4\;@z  #N80$ )  !fTBhC1// {yM" ) +\FMOdhihW,4$@tu4.?,^>+ ,;:) $($A! "! EkI]+:iN>: A]ELw7 AMD$&   t}Hh  2#"&56#".'3327w%( #1X98X2$ oxi!.C1$#0"aa< 2#"&546y"*+!5*.0%'"+-N 2#"&5462#"&54  )!+5 B)4"*$!')("+&#+*%2>=3353###"'#532654+532# (/ kyssyi8%I9C$A*? 5"xDPcW( BRUD%, u1#32>=3353###"'#532654+532#pp[)/ jyssvi8%I9C$A*;,X 5"xDPcW( BRUD%,  $)%*726546;#"#"'47&546;#";#"(J8&d)_FCOX7!UL/I#,  ?0W CU>1!Y8GS6'X.! /246;#"#"'4>3&546;#";3265f4!c*&z^;PX!?UL#  8'-F1>5H2/ES'S7IS1?F $;<"3674&+'32654&+532#".5467.44@F1Z[('d3B> p>_5! |X42$= Sd B0AM*'V( !SK7k GX(6)Kq,D;346 #4&#"32674+'325&+532##"&5*pj'IH+P;8JHXYIHd3C_olme 3l!B-#@-'OSK=SK7$7 eJUfP62#"'732654.'#5'74&'"'4>327537&54S.L6fEX29#(<)1sNR#*O?*Y08]+AsP9OAB@OT12. 0%:OܠMd"c @Bdq&": IE1%3267#"&54>54&#"#54'"#54632632D& .&DZ-6--[G? SH8S'5OQG(0(K4 G XP;=XE5U+/'30F'8F'=F'1G '9G'9G B.4>32&#"3%#".'732654&#'7"&G"9; M^ 6?f(  Ն-*)(^b-6KXb. P/% 'P8Y  D;/%*G3UH 232=3353###"&=&+7~!1>Ckkggi8J,Lg:+2=;g9JV?TJ)#34.#"5632#"./4'7326Jhh 3#L->vn /Q32"WE'9;-)( X ls.9. # AM9'732673#5#"&547.54632&#";#"n3nYg-,,L~}K 9?l.[JC*9'TNY.:747"&54>;#";#"27#"'4672#".32654&#"X#G(! J<)I&(?TA44 ~PxRp'"%'}H/D3"4 S4#X.\}Of0dEP ;/#&51346327#"&5467.#"32>5#".WF*U>3L $2;49((" .     /:(EOa):>+R _7NJ=f $($'0 X #JS=653##".'532654&#"#"'532>7.#"763632u, 76 ".4*,;;W*@-%6 0*.B$9CH3Q=He0ZYD7G(7_JMW')=/BW@X*a#353###"&'732654.#"'6gxjooj $.V5,o )PBG2&L"=kQ&E/%;[ /LK-? [&4&#"7633267#".54>0+:1C-K%C?&0c9wX+NJ->YZ>f c9'.91(XF*]&>)P8*>!#*2&#"#".5467&5462654&'"$@-)E[>YY>-JM*@b8# X77p?*NGgIVYCGnO)$4/AR)@N+=,%1;&7C#732654.5472&#"#"&'X j2:N@\]@<4.BdA\\A/LN)b}G2&"+<.[<#E05N'X!$ 54>54#"76323274632>XY>l2C/Kqh=XW=@-H/{:)?#!3 gU8);!(-9K9_2Ed)#3%#"'53674&#"76"&53327dooG]$H1$%(M-# 1%srO;T@h+bN99"Pa+5RՆe:CT%\ ".5463753##"327;F5$wRqq9D . 1T6QrlSF;{X40#5#.5467>54&#"#&54>32326734p,z-oTZ.1/5-a3 :%1H$TL[BB:o.""bS .%&06 , "13HR 8F+%7"327#"&547"&54632&#";)')LJB[gN;t[=Y=+,4* TTXgVJ/;+?MUDP461#5#".547.547654';#"326734p3$85%N9-b-< Z)1).~LG9,o4v ?,A,H)L &!RM'G+N "72654#"'463!53###".>%!QK"$HDSqO5G>7".=4+5323673#56O$%[<%"_rrF7%6+T,/ 5 _C64>32&#"3%2#"'#'&'732654.''7&\ 553b!>9>& 6gfkKCWb"KB  Q,  J( 'YU.LQ~5A"6&   8d"726=3353###"&54>32&#".;osoos'AA"l!77,.9IA/T)7O'sy9S) Lu(".54>32353###"&54354&'2"-&RN3RT,8@,kooi\:1X)$O6+-BNr: A*: s@.]<#4&#"5632353#5##"&543s#%=jppj.$8+bQ, X rj&;&`+'#5#"&546;2654+532"&#"32673+qW\k"`+EX7I|*  .& 3uq/t9x_(;UT@(2:7265&+7!2#;!"&/#5/>lIe3fG(V-%MT\D7k TU$#5#535327#".54632&#"po"6*7E9't)0"53 51-SJW&9a32&#"3654Mhs %!"RAV~ ?+ B2(XVHl#4=[k[=l+QO1 R F_#5#".54672&#32673pVYB[,jY5-'64+Wp,>*GC&P`N/9k*'K1#3"27#"&54>32#.'&+532>74&Kpoh,&1(>P!79f{5$5 fX {%#.%U3!9173267'"&=4&+5353#54:QOUm ,qqV(".`6 T$J&2353###;#"/#532654&+5&0#mppS9 + &F10 6%-1a T1U,*%T3"&547&543.'"32#"'53254&#"327)O+?.-?E]2M`5<1%YYBAM$J3~NOYw0&SP"*4$>AQ0%.B;!9(6[(+#53ggOe #46;#"#"&54323254/&=8*$6e6 :%Mn 0p6g50>$,S3- +$_*#a47W/<#3qq,^4>3'.#"#,JM)~3_ #*FUpKl8SZ)  `N,2#4.#"#&56>@{Hp0 XdC1A5&'*"<#'2#"&'732654#"'6I][KGh<71J7'H'%78YI D$3*"327#"&54>;)7v2=.CaXx$, 6)\-Q*_H%: Q\#+ 46;#"327#"327#"&547&G:dWDU=*'(O$?!*1'(O^XDY9KH7D=*%=+V4/%(r #".'3327=#D&>22`-x)"-[=t#3` O'7#%7uh]Q"G_ #".'3327#3"F&=12a,y) oo.Z=f)#3#3_oo  '7#%7#3 ]P\MLoo:& 2#'32g !Js2#"&54#".'33674&#"#"'532?672#".'7326%3274&+73274&#"'63#".'* %? &5b>-K2*oM4v *#)5#Z-O)H<9$p]*" +R"4H`4a!"db;16b c3'#5'74&#"'4>327537&54S.QT56* e).6!!-#,rOU $U>.E#,O,AtS6<&8F, 8(!6_OݠMd!~c +2&I^J !: I*E%327#"32>7#"&547&54>54&#"#54'"#54632632J8*'(J$4!  '(O_LF**-[G? SH8S'5OQG))`;=* =+F3CN(.$OLU>XP;=XE.E&e"-327#"&54>54&#"#54'"#54632632d#1&4F#*##E80&@7+@*;t$-'*'$317(9g4&'e"3f+J>3267#"327#"&547&'4>54&#"#54'"#54632632W& %8&=I1 !#F61?7+> %@?6)'"'+"0%306(8g3&'8,#0"&5476;54.#"3265_B@X`=?# (78+'4_\EB@B\_&7 P9:JJ:*463227#"=.7"3>=4&hSNg+3,t/B #,.# #ANgI<#"d g (7+v.*.+]&7432654.#"'632327#"&5&XF7c =*=?Q0k ,7H2M^T[Q 'OiU  Z[J +#"'7326=4'732>54.#"'6Zr""d}]lk6OG-GG++51#9 cR="' lH`FL83(HV   P!""&547&/7'32654.#Ml}N`7[4$ M@b%"!&"L5]E_^Gp+"Lj.Ga-.%8?!%;#"&=#"&=4+5323273 "i!44E[P "$* 4nE TqT:T -"#!.47467.54632&'"327'"#'2654. B&.C`v+Y!P %o]o]fq-H@\]@3HA#ADN   Rb  +?-=NL#8*%".54632#"54732>"3674&j+JF)`CSf "6W9O @4+@ 0*#`, +)Q9HJiX=c]>%]%7 6)2&!,-3?h,'"&547%327_BI>0;AI+k5hVY4P1%1Qc)"%#53'"327#"&54632&>q(>5"#0.ns"0'Q[M7O&^toW RK B%2#"&5464&#"326%54&+'3254'"'632'&543226e0<.-0=As"%'!#%*g5A.lukU .3N`B&Y@R:qv7C.*J@,(5?-0=m342'/BKPDE4OCU$"8"JY x1 A@I?<(#"&547332>54.5473vucPPH-?!0::0P 19?2!x{b0310IZ%BG+4N.%#(C, %+!07Z<0%%#"&5467635#"&=3;4&#"3260ke=54X P KbPWHJk\KJchoqc:`N%nQGPJGJQM<F'3%#"&54>7654.#"#>24&#"326Fmi/(6!-%1,PdN'++P\KQreHPmj|~g#;*$ &/',T>blfM@,I0Ka^OH^X<-9#"'.#"#.#"53.546326324&#"326pXP8$$ ()&$$v(V47LfWY7=jWlP>:=E@<@>Ys/XNH+"#[\2"  P0LYNN~T=YZ>=UR<"%#"&547332654&#"#&54632o P QLJEG;DEPy^Zyo ))!Nf]LJ:?M@]e^W<&%#"&54733254ᒐ&#"#4632*+fPPH4D<7#"&546326324&#"264&"326dg{ -@B]oLGg 0CbX{r9)*=:Z5>PTSADPd~zg-<M'YAJ[YF#Fl)2:*-6>AGRBAX`P-*%#654#"#"&=46326324&"26-1P1\43<322VQW$G01F$1&P$3:dABd9-TR11RT-[YVV>n]77]n<%%#"&54733254.#53254'5++gPQG0# \ADMP0!RNOpeI88CHW#32<qr< aFc,\<oA#654&#"#54#"#54#"#&'&'&!"53&54>32632632o/Q0/0,2AXW@BURPQsa^w>AYeLmrZ>TZA@V\P(%#"&54632327#"&#"6324&#"326cgPgT;@ -va?e\PXA?VSD@WasyfCeIP[>z]AZS?EZVP"%#654#"#54&#"#&54326321P1\34P43\1P1X3/d^yb5I55Iby^(LL<.%#"&547332654.#52654.5473{\ePSCAH//(`:8QQ8P(=F=(S+(Zdkb#BMMA(1<0*"'B, '3?/KT.%#"&547332765#"&547332654'5673sij P RK5--8b7;J(B_PV"6/+Qi|k0)!Lh#$b9)8A? M! 0 < H<9%#654&#"#4654'&#"#&5467>7673632632ASD480"%P.29+$ZE{z PNi` -A*J=VWlk_Uo;U"#L  ' F!K47t*ml64#X(,#K2/+$OnP%#"5332654.'3bPDUP`pVD$8+);<2>J#".547332654&'#"&5467.546322'4&#"3264&#"326&@X`51^W@'OPOpuIB4e=Bc9,)3]EBV!&.1'%15+75'%/+<%#"&547332654&#"#54#"#"&547332>32632')o P QLIC -"*P 34;P*%( +Z>LZNQo ))!Nf^K]15."> A47 $>N><7C#".547332654.+532654&#"#"&46326324&#"326A8opDvWT hSXi-$<9/>>0&> zU[~ZeC?3N`I<5#654&#"#4654'&#"#.#"5&546326325I.79/! P%$'9=LCBz|R PLni4sAqh\b6;dQh,c_aO54&53 iPTLJEA^Nd#P#I2')Pxh*01N`]L:_MD@AH1:I4 6 ="-%#"&5463254#"#4&#"56326324&#"26=zgibDX?!P1#A6IO&-]ROPbGJ^a`zldfn=pI^`G/"Z3<OXPo"-.#"#4&#"632#"&546326324&#"26oB#.P!?XDbig{OR]-(MI6~^JGb`aW!0G``Gp=nfdlz2Tb<<3HPOFGPN<w#.'#"&547332=#"&54632537'5&#"32wpn P PMOM;YU;E[PpppBD%5/!I/xm+*)!Pd9@9:E=\GHhO4!"P%#"&537324&#"32^h|P^^~PQ?BVT@?\thwv~XQA@Z<<I%#"/#"&'332654&#"57'&#"&546327654+53232654'7/eCW5a 8t$'~ #L'78DMQ9MTVH+7>-.? 5{G.!E$?>AM_a+Fl&(c*) 4<7#"&547332654춮춮.'&53$!?)EJ(YPU>9S4]a66ad0;JX4PVV/9#"&54>7>4646<54&#"#&546324'326c]+922&'&)C \BF<I2FgBD[HaoiZ%B-&  $48')*AK^k%.98Gm5(AL[0=%#"&547.#"#.#"53&54>326324&#"326lZMg1 -&BR_XVS C^[-YYk#T?ZkcM7,-":6C[00%'7-C!FO:dGEEtXAY`=QR"#"&54733254&#"#&54632dbQl,F,H74>-9FdFKeKcjaP>=5E7I/@A:-4!&.FTUJ2#"&547332>54򂂮&#"#&54632RoFF9*:> '.8.5@FiQFg5.>(0cQ@8==9G&&@0&<(2C)-6;5PUND1J ]V$0%#"&547#"&54632632$4&#"324&#"326Vg^QpJ,A>QeIG^:2QLP9/.13*/ 9@B?D>?9`ziQf(T>HZUF=.{^=D0*9D]lF?Q^'%#>54&#""&546326324&#"326SF&-:7@(nrv_Q=8SQcC=GCCDE>s])t89P429\wu\_t==nS=RXIFYg%#654&"#&54632;F;@xA;F;mVWkpSNv?[\>tPUnWvv+#"&547332>54&+53254Ȕ!*, $L:Us F D<, '((A&C*BC2CUF9NI%cT@55@#654&#"#54&'"#54&#"3#&)53&54>32632632-.F.,(SF'+(-F"&a7M*CRTqN:L!%V#>%TATMUKX+Dbhg4-5)le)<1M1&:Q8bIII) I`'%#"&5463254#"#&546324'&#"32\]Zrm\K5urFiSP]F(&-@>A@x_ruZ\y? R_]PX!!`CB[*%#"'&54632327#"&#"6324&#"326k^F:=&%-A@^u01}OIZCn:w[B^V@d##](%#654&#"#4654.#"#&54632632I2K2:&%.3) $>0[%+.#"&5473325#"&547332654'53273WgSr,F,E9CX4V=;QE($!&,aK<>jp_R@;5E9G) 4;>B9$)("/H@1%#654&#"#54&#"#&54>53632632IXW>Q)%W;SR9B.&53R=@%97)+7:Q<#".547332654#"#54&#"#"&547332>32632Qqm;mL@cEQWK$$<#:%1=&F&#*(!T89#n+[=:/)@CNiSJR4&--+4+;0-$,%$))#@J9.:#"&54733254#52654&#""&54632632%4&#"326xfhA VIz9A//[kjmPf53aDMm76>65C?=;5=5E8H0$5u:N=6%#654&#"#4&'&#"#.#"53.546326324F446.$ <'<6jT%u#VGj]2{[9AfZ(C:dI[=QDF8O"3aq9 eAf 'b1C ;,H[{+$Ok$#"&5473326=#"&5473326753a`So,F,H7D>>BJ\3F39/%C=5E8HWG2ZJPHEO0F% $/%#"&5463254&#"#54&#"56326324&#"32dX\mjZQ4$", 1 1?),C='P>9F;@??@A?Z}v][v:"-5-<22:=F)??T@?]^BC]*%#654&#"#4632#6324&#">KFKA9-S |Gi6#E95/Z6%#"&5467332654&+532654&'&'.5473Z9.05lE9FAAx~Qk=;?B;<(*!F'77'-< P4jr£XJ[eSOC,y??@;9?B?u=7.2518,#:v[]v{\yAS??)B^]]\%/%'#"&54733265#"&5463237'&#"26wYmQl,F,D9H<3Z=TU@J?=5E9GSKKP=?NP|~TonoY6#&78%#"&537324&#"2mZRl@{7ZunRdw`F`M#"/"'5326549'.#"&546327>54+53232654'7H/@&c+8VHM0*5.$P )11J9M#T5}$=,] 33<[.:OqB*@F#=.+)#+I$6779LI< 5!':$H;%#"&547332654&+53254+53264.5473pVdtFCM6L $SREDST 6LL6AYI:'$*/&(-RKfcNM.4;'<5=<. 1( &/(+ 1$&/ <X=E%#"'&'5767632327654'&'53254'&'532654/54#"6XUC_NC12+V-J3@3 P4E7E6/XmT/;8H)1X+"l[6lSy-W@; 6 :+ 6)7@E5D8#>?*z3^EKDl&'567&5462'4&"6lWPQV1?iXXi=3A6`6ff 56jHZZHj63993Z..x!#"&5467327654#"'7#5!632 (rN_$ 'D5NY$!* 4r/=YL'6)/4A1"W4:#"&54732654&+532654.54632'654#"hXL^*!A1>FT<--%X5LL5NF"#A1g+ W(3##"&5476;5#"5476323#3'54#"35#"32OUFN^2/S\\0/MHSOOOdr$FNNE$=5dxGUXMO,(HM(&MEn4H|kaf>u@5;<D /FNs805w3!2#'32654&+5lpplR5'%#".+#!232673264&+)(=X, 5)p]-luE<<7 CKKCVG-:;:-ogHeaF65DxD&##5!7]<yRR,4##"&5332654.#""&4632675#5264&"0Dk@!ZLNNTF$-/S5?O9X~XX? 6u4&6&&6A~=]l9csX~]B-UJ-><9gZoonAf>>f= &"32654&3254&#"#5632+ &632|ttsN1 {=GL򥤄:O1NVӤ5#7#5]]]ii*?2732>54.'!53&54632&#"3##".'{)-A";5,nuz;N%m3=%di5oQ(KJ=c2,ADYaWo)Je)$!AI\&=<";)$$.732>54'7#".532'654&#"=E:CH:%*&A>#Ғ/VSE4-@~0'2G!1HqDBJ6T~L-KeU'D_6 0JS[zN525#"'#37&' pA@3/c^^?iiBI]{74>732?33#"& G&Lqo&U@Ud-#, {_OGf %!#3# Mcxhepx')L72653#"&=3@0]o_^m_87TM_nhY@/@D5@ !!!!!dLRRR "7###"&463233!$"32654i]) L42L )]=8###{{2A]\B2 -3"#32$#7#32>54&#"#4632^^&C@&\C3MTv`o3Xc~`%J5cdV>jwFi9.9"&473327!#"&547332>32!4&#";LO,f %=)7 327&54623267#53##"'7654."bl$<   ?0+/wggw/*2@6/ ehRLMM_bI 6) H   ,.KIAAb11c<_7$ $7_< !# #333ffhdhWPP 7232654.'&54>32#4&#"#".54&%1(BJ 2:"B+U[S,%Y(88(pq AL9&%*?"LI+.6Q*4 !2(]l5BR!D=CZ2` !5]<23#4632#52654&#"]c)MH+p\58S8CK#\q.W32#.#"32654&'#53gKwG/0GyL+_^Wj{m^aHSFF~}At3Ni`12bjO4NNO:A=QIo_(KA'5 !##33#bXԁXc{'c4>32#5#"&+532;4&"+HL*c]SU}%%YKH;W,q\ݖ`R$GZD@SB32654&%4&#"#"'#"&5467'63267#53#32>32"  439++"6 X'>F9>)PW-*b67J C 36(!#4!M\k'2P) -CZ"d*%,%R,.#6D\-hBHf7P>j_pAA=R&/&ZB463233###"&"326&x^^vMt|~qr}}aѰ;'LУ5f !#3!3# ]]w]]L;'##"&'332654&#"'675#5E0Yh}k^pTkENMDMH'V4Auk`~j]bo<,GA 3#32?33#"&=# C&Lqo(S@U8T8 {_OG4J #"&632.#"!26^pm ԌaVԐ}|Fu~!535.=#53533#353¡@@]8HA]F<[sFF09 $326=#5!#'#"&54>32#.#"{$9^>-b   [ ";3)''*9g)h $0=, M+2 Y532#54+#f]]VҢ; !!5!59LfTRR5R !#53>32#5#".'#53#;4&#"2 OZ4c]3YN 3.mKCpGAA>Pq\ݲL32#"'#"&54>7327&546zDUKLJ4_'CI)ClE./`DbDAUqx+$BI3)-=ED]?E?jg;44z{'C2I8$GZ&6K'h*94632632#"&'732654&#""&547&#"72>54`HC<"7> BQ/.WHHb!4@  ԉ11mXZd.18#%51C}z`_`_=^8# #8^=r1!##"&'732653332>32'7>54#"#"'>d#[CZA5(#*d¶c0 3?,  1 2?: EkNB#18hMeY23h!3E  32& ?.#"324&#"#4>32#"'#"&54>7327&54632GN#*e;LJ4_'CI)ClE./`D`H@Tqx+$BI1'H8(P3-"?jg;22z{'C2I8$GZ",=no9$>6&#";#"32654#"#5632#".5467.5432x]A8LBa$O8]ID:2)>[*DE0Ag>(E=81/GPg,IRf0.3 ,+Q @3+=%"3D=?l85„2b 3#"&53!!3265]]veUXdnoFOOTJl*2>32#"&'"&463275332654&#"264&"2Kew +W~XX?2N1_7'Yo{;}#&6&&6l@D̓sjZmonG>t"0H-"26f>>f== 33##!%5=]]=_zR R5U %#!33232654&+Ud]=@RQAcxfR=@P"&533273632#4#"#A:I0,^'A:I0*^'LLNnLLN =G32654&7"&54>7.54632>32#52654&#"'654&#"|13($Uz.<S`Mi.*@78G9B@ 6M\XE ,++:KR(02@3'#<&* ^6HftR0L6"-R3;UV>ZB;SQ"*1<@!*!%J5F!4&'5254&+#!2f?8KC]-luOCw _:cnicdd)@i' 45732>54.546323!53&#"3##".'p)-A".JYYJ.uzPq7m$W3=%di5oQ(KJ=c$=-,-3H*aWXFAAPe)$!AI\&=<";)52#"&5##5!3264&\p"54.54632&#"#".'p)-A".JYYJ.uz;N%m>]m]>5oQ(KJ=c$=-,-3H*aWo)Je =-:9X3&=<";)#C,7>54&#"'654&#"#".54>32632%32654&./4*/_W K,X0Uv2pY;X+>nI@dEXW^VM<.+E` A)-CD*?4T `LsbZP|I21clLHvKglTY3<E"654#"&54>7&54632#"&547'32654%3254[232DRJFY($B'MQQ>?QQM'B$(YFJRDiS<)3.)<>&0/'>RFaiFJ<8+77 J>DNND>J 77+8<JFiaFRONH><6,66,6<>H2"!!4632#54&@0h;o_^m_8TM\R_nhY@/@D5!!h;yR4>32#.#"32673!".0GyL+_^Wj{mZ``!KwG/d2bjO4NNej3Ni`&#"&=&5463233%54#"#3265ifbPC=P]9"],+N~]piXMbW;eWNZ5,?WyXI(72#'2654&#""&547&#"3#53>3262>54Jbl\@&'=2+/wggw/*2@6/ ehRLMM_jSUg\7(84KIAAb11c<_7$ $7_<5C +#!23264&+Cq[]-luOCKKC]qoDxD'4>323#53.#"32654'7#".-EvLqVUOirmC_6FsKwG/d2akO4jnTTDBD,"O?NOq3Ni` 3##5!#3kLM`[gTB'5 3#3%632'>54&#"#^^V'%*/ 3-'$^ :')1E  ( 5x #33 #]]kx,nqPv %5#"32>+"&54>;@RS?+@ ]bb/Ta:j֛ZA>\ 30ddA_4&%'#".4>3277'4&#"32657R2AIvD##DvIA2RH/wRFnV_qq_VnFRw/ySKvzvKSyoys@}}@sy+327#"&'#"&54>32#.#"326=0?,82FVh+?2KP}_qSt3iJSLMTF \Q27ө0ajP5zoFQ2_b<^1Y,8I'7327&5463232>7.54632#"'#"&4654&#">54.#"WO1!dHQUb<28>"BK9 sWFBcD8cwGcO><`{!!.%-   MYuóO@!5sRui:ei243,w^4/;C4;<_7$ #8^= ,#"&632654&#"323%3267#"&/.#j vNw2 -& tIr"";# aV23NF%!;*/F>2/o $-7%2>54&#"#4>32#".532'654&#":];'/# R+1#Q])R_/VSE4-@=E:~0';+E_b4`8MBX-ŋQ~K-KeU'D_6D2G!0JS[zNE"73267.54632#"&'%654&#"8"c7CetnuJId+PLU,/"#8KFIfT"WcSVdY>EecW>;b$" "%2654&#"632#"&54632#4&#"'QP\B;b V^6j~~xsjXBI7TFEU@4^bH:}dmwa:P B'777'324&#"#4>32#"'#"&54>7327&547' A4434+_'UKLJ4_'CI)ClE./`DbDAUqx+$BI3)MhQQQQ266D]?E?jg;44z{'C2I8$GZ&6K.:T 53527&'765462#"'73254+5254&#"'2*!hp!4@rgT:k=D<>F)3X75#50Qt2ZLNNTF$-/S5%U@.UXE1*J4A gJcsX~]B-UJ-t' h"A24&#"32#54+#4632AER7f]]b`F>E\0VҢ\qkVO*277'.#"326=#5!#'#"&54>lKnCRH/wRW`Qr}$9^54&+Uva(=Z-eF?}/1>D?^r$;;p/T+49E2{ %!FI\T&2{}&7J2{% !TT2{v'[l727-{Tr2'[[92'[['[[92'~o)92'[92 P{TNN&m2'[[>2{&[52{'[52{&[72{'[72{v&[82{v'[82@&[92@&9[2@N'['9[2@N'[U&9[23'['[n92@'>[2@&>[2@N&['[F>2@N'['[>2/'[q'[>2#"'#"&=326=326=3B.3""3.B6"0"6"0"6.B''B.""""23*@&[J2'!5VU4.2#;.23#28;2* "&53265ggF>X>IggI,>>,2* 462#4&"2ggF>X>*IggI,>>,2 2#5264IggI,>>, ggF>X>2 2#"&46264&#"GhhGIggI*??*,>> hhgg>X>>X>2'SS2'~~23462"2"0""0U0""0"2^5!2,;;2^ 33##5#53;yy;xxy;xx;2^##5#5^y;x;;2_'TH(52{'T^(72'T92'T(>2{ 3 {\[_FF&62{}&eJ2{3 # 2_&62{v'[je2 5 2r1Z2'[[g2&g'[[[[2&g~o)2'[g2!  r1mmZ2'[[l2{&[c2{'[c2{&[e2{'[e2{v'[kp2{v'[jq2&[g2@'[g2N&[&g[[2@N&g'[[[2@&[l2'[l2@N&x[F2N&y[2'[lk'[kl2T-T"5vw2m3#2;;2m4&#"#3632#! &66 4&86#0(m+0!2"&53265TJvvJS}}S2}'J623462#4&"2TvvJS}}SJ2v'[2!2#!5!264&#!2AAbbT2v'[2v'[m'[2'~d)2'[2)"&63!!"3!AbbA.T2v&[92`&[2^'[2^'[2^&[2^v'['[2^v'[ 2&[2b&[2v'[2bv'[2b'[2&[2bv&['[2v'[&[2a'&[[a2m#"&46;#"3EaaE,55,FuvFOlN2%'~2%'~2%'~2%&~2#"&54632#4&#";bebR^FE_`DlARPxS :nB45J2}&J2532654&#"#4632#lD`_EF^RbebARJ54Bn: SxPR2v'[2#"32653#"&5463lD`_EF^RbebRJ54Bn: SxPR20v'[2x'['[!232#"&5332654&+bebR^FE_`DlRPxS :nB45J2)v'[ 2&[~2'[$2&[2&[2v'[h2v'[2&[~2'[#2v'[2v'[2&[2'[2v'[2v'[2&[&[a2l732#"&533264&++R83H8# #//#+Lp6:7(#42l7#"326=3#"&543+#//# #8H38RL84#(7:6p2'~%2'~%2'~%2Y'~24632#4&#"#2ebR^FE_RPxS :nB422}&J2#54&#"#4632R_EF^Rbe224Bn: Sx2v'[275332653#"&2R_EF^Rbe224Bn: Sx20v'[2x'['[!2%#"&53326=3ebR^FE_RPxS :nB422.v'[2.&[2'[#2&[2.'[2v'[g'[2.v'[&[2/&[2'[#2Av'[&[2v'[&[#2&[2/'[2v'['[2?v'[&[2&[&[a2l7#"&5332657R83H8# #/6:7(#2l73326=3#"&28/# #8H38R#(7:2#!5Rf&R2}&J2!!#2fRRx2v'[2)5!3RR20v'[2x'['[!233!2RxR2.v'[2&[2'[#2&[2'[x2v&[2v'[x&[2&[2'[#20v'[&[2v'['[#2&[2'[x2v'[&[2.v'['[2&[&[a2m(332;mm:2p "&463"3IggI,>>,pggF>X>2m(#533(;m:32m4>54#"#63232%56%B4r2@3>3m(A+&/7{:.&F).2234>54&#"#632!2)AOPA)P< Xe~3NYN3\;cE<89L,9It\4fKK8;P2332654&#!5!2#"&5RJ54Bn:~SxPRblD`_EF^Rbeb2&J2#"&5463!!"326=RPxS~:nB45JbbebR^FE_`Dl2&[2754632#!5!2654&#"RPxSj:nB45JbebR^FE_`Dl2&[d2&'[[2%#54&#"3!!"&54632RJ54Bn:jSxPRlD`_EF^Rbeb2'[22&[V2 '[dV2 &[Et2'[E2 '[2'[2'['[&2lq#54&";!"&5463284#(7:6p+#//# #8H38R2m26=3"&=hHdH6ggڽ2HH2IggI2lq5432#!532654&"p6:7(#4+R83H8# #//#+2!#532654&#!5!2224Bn:~SxR_EF^Rbe2& J23"&5463!!";PxS~:nB42ebR^FE_R2& [22#!5!2654&+5PxSj:nB42ebR^FE_R2'[2 2'['[ 23#"3!!"&546224Bn:jSxR_EF^Rbe2'[22'[V2 '[dV2 & t[V22& [V2 '[d22'[2&[V 2 & [dV2'[22 '[22 &t[V2&[V2 &[V&t[22'[V&[2lq";!"&546#(7:q8/# #8H38Rm %7'%$L65bUW_442>  ->0\ mt[«Yq2!".=3;rAo[5TUhE3rThUT5[oAkXJEh<2v'[0%2>v'['[%22#54&+Ao[5TUh43,J?A=  +(.971"*%1:8;2m 3#"#54631;+:1\D%%QGCA2m "&=3;;m6]QmndX]62W &+532#"&5432DA7FZ44,|4%#Ȓ9C5@)*@' 2W #"&546353#"32654.pu,44ZF7AD%%@*)@5C9O@ 2)F462"462"2#54&+5$$$$(D\1:+;$$$$ACGQ%%2F&?l2F&?26F&?26F&?2 %326=3#"&54&#"#54632E42GR~MLE42GR~ML;mT6NzP;mT6NzP2 %4632#54&#"#"&=3326vLM~RG24ELM~RG24EPzN6Tm;PzN6Tm2 v&E[2$+%&5463232654&'52#"&/.#"XEn >,-?@/WloSVa H%1P %*TT wTT~=+GNPTSur|K^|64PX- 2$~'[AG2$+%>54&#"#"&5463326?>32:*% P1%H aVSolW/@?-,> nEXT -XP46|^K|ruSTPNG+=~TTw 2$~&I[A2'D[2&D[2'E[2&E[2v&['E[2v'[&E[2&[G2'[G2~&[H2~'[H2&[I2'[I2~&[J2~'[J2k *2>54&#"#"&546332?>32  4 0 ?86JG9*)? I-:V :4##R=0QJMS6743/DS77[O233#!kgTiC2}&\J22!#39TiC2v&\[2!!3#kLTCi2v'[<^2Jw'['[^23##3!gTLC2v'[a2m'Z[2n&Z[2m'\[2n&\[2mv&['\[2nv'[&\[2m&[^2n'[^2}v'[i2nv'[<j2m&[a2n'[a2mv'[m2~v'[n2m&[&[aa2mB#7#533zH;mȥj2m '#7#'V@5l_ai4>mm2n 33##5#53;;ڕ;;2n ''7'7p********2 26=!!"&=EhI}xE_`DRbb2 3#"&=!5!265QzPR}IhEbbRD`_E2 54&"!5!5462EhImA}xE_`DRbb2 k'Jz2 #54632!!54&#"QzPR}AmI44EbbRD`_E2 d&z[2532+#3264bbRD`_EQzPR}IhE2v'[|273264&+332+2E_`DRbbQEhI}x2#";##"&46;E_`DRbbEhImA}x2v'[2%#"&546;3#"3bbRD`_EQQzPR}AmI44E2v'[w&[2v'['[2m%#";#5#"&46;%F2A@3F:HWYFT(F"lFpK2m8 7'5572#L65bUW_442> -5 5%20 \0mt[«Yq2 &5462+264&"\dddFF3F33F&3.Fddd6F33F32}&J 2!#32"&547264&"^Fddd 3F33F6dddF5,F33F32v&[235'"&4632%"32654&20dddF/1$22$#34^LFddd3#$22$"42N&[02! 632"&="32654&,1/Fddd0"43#$22dddF(4"$22$#32N&[02N'['[C2N'[0&[C2y%7632#"&'6264&"#22# /Z<΄2F2*2K2"&5462#"'265264&"dddF-)&3F33FJvv FdddyS}}SF33F32326=#"&462"&5$4&"22T)-Fddd.3F33FJS}}SydddFvvF33F32!#4&"632"&5462264&"T)-Fddd3F33FS}}SydddF vvF33F323462"&463254&"$4&"22dddF-)3F33FvvFdddyS}}SJF33F32v'[2v'[235!264&+"&46;2#"2642^S}}S!dddFyyF33F3TҰ)-Fddd3F33F2v&[2)"&6;2"&547#"3!"264yyFddd!S}}S^F33F32dddF-)Ұ23F33F2v&[92Pv'['[2v'[&[x2mh264&"#";#"&546;2"&54B)33)>-,?. . n19,+:,4?-,??,2m'/7326=3#"5!"&546323&54632&264&"264&"W85)`->>-,?J>-,? . . . .819,+:,4?-,??,,??,6. . . . 2T'4&#"3254&#"#432#"&54632#oNRk<5oTs2I+L1VuspTNoTKLKy&S,$D=%emo42T'#4632#".54632#4&#"32654&#"TpsuV1L+I2sTo532#"&53oNRk<5oTs2I+L1VuspTNoTKLKy&S,$D=%emo2f!5!332654&#!5!2#"&5dgRJ54Bn:~SxPRRlD`_EF^Rbeb2f5!#"&5463!!"326=2dRPxS~:nB45JRRbebR^FE_`Dl2f5!54632#!5!2654&#"2dgRPxSj:nB45JRRvbebR^FE_`Dl2f5!#54&#"3!!"&546322dRJ54Bn:jSxPRRRvlD`_EF^Rbeb2m!5!#54&";!"&54632n84#(7:6p8+#//# #8H38R2'5!";#"&5463 |BZ:nB422PxSzt^FE_Reb2&[327!2654&+532#|:nB422PxSzt@^FE_Reb2'[ E2%#"&546;#"3!5 SxP224Bn:beR_EF^t2&[(D2m#"&5463";5)697:A>25B6A:L2L333##5#535!kgzzTxxTxxTw2L !3##5#53539xxTzziwTxxTC2Lv&[z2L!!5#53533##kLxxTzzwTxxT2Lv'[<2L!##5#53533#!gzzTxxLCTxxTw2Lv'[j2mR#7#5#53533#3HpkCC6DDmi6==632 3632#"'#6264&"2T1=PrrP=1TT@\@@\#ss##\@@\@2#"'#3632tMP:TT8NSrSn8u76v2746323#5#"&2tMP:TT7OSrSn8&76v2%#"'#3632rSN8TT:PMtOv67u8n2463253##"&2rSO7TT:PMtOv67&8n2 !!!!#2ffRRR2 )5!5!5!3fRRRC2 33!!!2RfRR2 #!5!5!5Rff&CRR22>=3"&=##$ , RHHNRڽ MccMkx2354."#546233 , RHHNR MccMk&2!#335462#54."$RNHHR , xkMccM 23##"&=32>5RNHHR , &kMccM 2  ##37ѡTss{2 333#'2ѡTssm&2 !#'#33^ssT{2 373##2^ssT&2D46233#"&54&"2gg1-TTU]6L6 IggIFo&q&66&2D#4&"+3265462DT6L6]UTT-1gg &66&qzoFIgg2D326546;#""&2T6L6]UTT-1gg&66&q&oFIgg2D"&54&##32265Dgg1-TTU]6L6IggIFozژq&66&2{ !3 373H^\[_tt&2{ !# #'z^_tt&m2  57'72r;ZX2'~)2&[2 ! %5rŔmmZ쉻X2{ 3 3!!^\[_90F&cT2{ 3# #'!7!^_90&cT2 5 57%2rPT+ZZ012& L2'[ 2 % 'rPTZZmmZ0:1d2{ 33{\[_R&2{3 ##2_R&2 5%!5!%2rvvZR2!#5#5353!%5 5;HH;vrDmmRmmZZ2 #5462"7#64'3%5 5 gz#.##. vr.RB2++2).ZZ2! !!rvvmmZR2{  3333#'#{\[_RSRSS&  2{ 3 ####353'2_RSRSS&  ^2 5 575#535372rRZZeR1TRTT237!#5#535335'5 575.;..;ArTRTTmmRmmeZZe2  64'5'5 5777%462"&'#5 rRzzz.. -C,xqZZqIRHH)**))B.R2 % 3#'5#75rRZZmmZeR1TRTT2 2657 &5TbbCTi2 %4&"46 T.TCbbTi2 7!264&#!'!2#!CbbTiTT2 '~) 2 '[ 2 !"3!!"&63!bbCTiT.2 % &5-2652mmmicbb2 !%46  4&" .cbb2 3!2# !264&#!2cbbmmm2 '~) 2 '[ 2 !"&63!"3! icbb.2 26= &53!5TT2юbb i2 54&"46 #5!T.T bbi2 %3264&+%!2#!53#;bbiTTT22 '~h) 2 '[x 2 #";!"&63!#3bb iT.T2^535332y;x;;2%#"'#"&533265332653hIO77OIhT7&%7T7%&7TJh>>hJ(&66&(&66&(24632632#4&#"#4&#"#2hIO77OIhT7&%7T7%&7T(Jh>>hJ(&66&(&66&2 2#!5!2654&#!5!2654&#!5Gk##kGD$88$D$88$DڀL*__*LTO)(OTO()OT2(2654&#!5!2#!5!2654&#!#5#5353$88$DGk##kGD$88$;zz;P()OTL*__*LTO)(PmmRmm2 0462"'#5!2654&#!5!2#!5!2654&+64'#.##.6 g$88$DGk##kGD$88$ T2++2)k.RP()OTL*__*LTO)(P.2 3"&5467.5463!!"3!!"3!Gk##kGD$88$D$88$L*__*LTO)(OTO()OT23265332657#"'#"&57&%7T7%&7ThIO77OIh,&66&,&66&TJh>>hJ(2%4&#"#4&#"4632632L7&%7T7%&7ThIO77OIhT&66&,&66&,T(Jh>>hJ2 7!2654&#!5!2654&#!'!2#!h$88$h$88$TGk##kGDTO)(OTO()OTL*__*L2(!2#!7!2654&+#5#732654&#!3532Gk##kGDTh$88$;ţ$88$;ڀL*__*LTO)(OllTO()Ol2!0462"72654&#!3#!2654&+64'!2#!#.##.$88$` `h$88$n Gk##kGDT2++2)kP()O.O)(P.DL*__*L2 !"3!!"3!!"&5467.5463!L$88$h$88$hTDGk##kGO)(OTO()OTL*__*L2"'32653265%#"'#"&553?7&%7T7%&7 hIO77OIh TĄj&66&&66&%Jh>>hJ(2"4&#"4&#"74632632%#7&%7T7%&7hIO77OIhT&66&&66&j%(Jh>>hJط2$2#!#53!2654&#'32654&#!Gk##kGD*$88$$88$ڀL*__*LCTCiO)(OTO()O2 ,!2654&+#52#!#5332654&#!353N*$88$<;wGk##kGD<$88$֊);CO)(OllL*__*LCTCO()Ol22462"732654&#!!2654&+642#!#53`#.##.d$88$։ *$88$ Gk##kGDT2++2)kP()O.O)(P.VL*__*LCTC2$3"&5467.5463!3#7!"3#"3!Gk##kG$88$$88$*L*__*LTO)(OTO()O2m3732EE22222'[~ 822%#"'#"&53326=3326=3hIO77OIhT7&%7T7%&7TJh>>hJ(&66&&66&24632632#4&#"#54&#"#2hIO77OIhT7&%7T7%&7T(Jh>>hJ(&66&&66&2 2+532654&+532654&#!5Gk##kG$88$$88$DڀL*__*LTO)(OTO()OT2$%#332654&#!5!2+532654&+j;;$88$DGk##kG$88$,lO()OTL*__*LTO)(O2& >[2 3"&5467.546;#";#"3!Gk##kG$88$$88$L*__*LTO)(OTO()OT2 ,"&54632#".5332>54&#"3Ylq\i/N[AypCT%:MH%=\=([Ey>3jYW^bpM{}S4$N`x>a;&2>\W32#4.#"3254&#.Ylq\i/N[AypCT%:MH%=\=([Ey>3pYW^bpM{}S4$N`x>a;&2>\W54.+532#"&54632T3)kkN5Y6'&;a>`N$5KsCpb^WY3>yE[.CPA%HM:%TCpyA&\dR5i\ql2+#"32>54.+532#"&546;53#1AikN5Y6'&;a>`N$5KsCpa]A;;myE[.CPA%HM:%TCpyA&\dR5i\qk2-462"'"32>54.+532#"&5463("0""0XkkN5Y6'&;a>`N$5KsCpb^z0""0"yE[.CPA%HM:%TCpyA&\dR5i\q2+33254&#";#".54>32#"&T3)kkN5Y6'&;a>`N$5KsCpb^WY3>yE[.CPA%HM:%TCpyA&\dR5i\ql2U&32654&#"#4632#"&54?!5!"- uOGp1" TUA=frun#(!-7aZ0*6&2Q[cQRZ\Ta2U&%5!!#"&54632#4&#"32654.#nurf=AUT "1pGOu -aT\ZRQc[Q2&6*0Za7-!(2U&>54&#"32653#"&54632!!5"- uOGp1" TUA=fru)(!-7aZ0*6&2Q[cQRZ\Ta2 #&#37632#"&5463"32654&#"[aT\ZRQc[Q2&6*0Za7-!(Y#nurf=AUT "1pGOu -2 #)#37632#"&546753#532654&#"[aT\ZRQcE?;;06*0Za7-!(Y#nurf=8Q LS 41pGOu -2 #.%32654&#"#37632#"&5467>32#"6*0Za7-!(aT\ZRQc84 '"00"*)1pGOu -"#nurf=2M0D02 #)4&#"3"&54632#".##2326O/)/&2Q[\PQyW>rTKHTAkI=54E(5IIn0" TUA>esx\\A#3RbcR3r2 #&%3##"&54632#52654&#"32>aT\ZRQc[Q2&6*0Za7-!(Yurf=AUT "1pGOu -2U%32654&#"#4632#"&546?'5UG/pTKl1" TUA=fu|GY,a5E=2:?-*6&2Q[cQOqfXSnA a2U%35>54&#"32653#"&54632%2YG/pTKl1" TUA=fu|GY,a5E=2:?-*6&2Q[cQOqfXSnA a2 #%337>32#"&5463"32654&#"2a AnSXfqOQc[Q2&6*-?:2=E5,YG|uf=AUT "1lKTp/G2 #)337>32#"&546753#532654&#"2a AnSXfqOQcMF;;#6*-?:2=E5,YG|uf=;SJV 1lKTp/G2 #+337>32#"&547632#"'32654&#"2a AnSXfqOQcP."00"$6*-?:2=E5,YG|uf=l&'0D0(1lKTp/G2 #%#'#"&54632#52654&#"3267 a AnSXfqOQc[Q2&6*-?:2=E5#,YG|uf=AUT "1lKTp/GY2 n32=3#"&547!5!  J:Tk`zn*L||u}|N8T2 m!>54&#"#54632!$!  J:Tk`z+Kzzv|{O7T273632+53254&#"2T8N||v{{L*z`kT:J  !2& XLr2& X[\l2%.#";#"&546323*L{{v||N8T!  J:Tk`z2 7#3!32=3#"&547#m;;!  J:Tk`z,m*L{{v||N82 m%3#5!>54&#"#546323;;S!  J:Tk`zm*L{{v||N82 #632+53254&#"#5!^k8N||v{{L*m,z`kT:J  !;2 & ^Lr2 & ^[l2 5!#.#";#"&546325,m*L{{v||N8;;S!  J:Tk`z2/#53#"&5467#532654&[Ԁ:EҕE:7HeeHT!rDggDq"TX8D``D8W2/#%#53.54623#5>54&"Ԁ:EҕE:7HeeHT!rDggDq"TX8D``D8W2U#53>32#"&'#533264&#"T!rDggDq"TX8D``D8W)Ԁ:EҕE:7HeeH2U& dL82U'[ d2U%3#5#"&463253#.#"326ȍT!rDggDq"TX8D``D8WԀ:EҕE:7HeeH2!5!53#5#"&5467#532654&[;;:EҕE:7HeeHkm!rDggDq"TX8D``D8W2$!%!#33.54623#5>54&";;:EҕE:7HeeHk,m!rDggDq"TX8D``D8W2!##5!#>32#"&'#533264&#"*k,m!rDggDq"TX8D``D8W);;:EҕE:7HeeH2& jL2'[^ j2!.#"32673#5#"&46325#5!#W8D``D8XT"qDggDr!m,k)7HeeH7:EҕE:;;2 $#"'#"&53326533265353#5`IG77GI`T/&$0T0$&/;;Jh>>hJq'55''55'qll2 #$74632632#4&#"#4&#"##3`IG77GI`T/&$0T0$&/;;TJh>>hJq'55''55'l,l2$!2#!5!2654&#!5!2654&#!5#5!#Jh>>hJq'55''55'l,lN`IG77GI`T/&$0T0$&/;;2(!2#!5!2654&+#332654&#!5#5!#Jh>>hJq'55';;'55'l,lN`IG77GI`T/&$0m,k0$&/;;2,462"!2#!5!2654&+532654&#!5#5!#"0""0Jh>>hJq'55''55'l,l0""0"a`IG77GI`T/&$0T0$&/;;2$5#5!#!"3!!"3!!"&547&5463l,l'55''55'qJh>>hJNQ;;/&$0T0$&/T`IG77GI`2 463""&54426n\B++B\zz"C_T- xx -T_CUyy2 #52654623"&54&"\B++B\zzC_T- xx -T_CUyy2 !"&533!2#!"#463!264&C_T- xx -T_CUyy<\B++B\zz2 '~) v2 '[ v2 %!2#4&#!"&463!2653#!"TC_T- xx -T_CUyy\B++B\zz2my!3!#2G672'y 333##5#75#535766M Fn6FFr6!!""2 & t^2 & u "R2 & vM22 '~) ~2 '[ ~2 & yN2 *%#"'#"&544326533265463"_HE77EH_+B\.%$.T.$%.\B+Kg>>gK -T_Cz'55'q'55'C_T- 2 *46326323"&54&#"#4&#"#5265|_HE77EH_+B\.%$.T.$%.\B+(Kg>>gKy -T_C'55'q'55'zC_T- 2*2#!"#463!2654&#!5!2654&#!"&533Kg>>gK -T_C'55''55'C_T- _HE77EH_+B\.%$.T.$%.\B+2.2#!"#463!2654&+#332654&#!"&533Kg>>gK -T_C'55';;'55'C_T- _HE77EH_+B\.%$.l,l.$%.\B+2& [2*7"&547&5463!2653#!"3!!"3!2#4&#Kg>>gK -T_C'55''55'C_T- J_HE77EH_+B\.%$.T.$%.\B+2  )2%#"'#"&54435335463"#3265#3265_HE77EH_+B\T\B+T.$%..%$.Kg>>gK -T_CccC_T- j'55''55'2  )246326323"&=##5##5265734&#"34&#"|_HE77EH_+B\T\B+T.$%..%$.(Kg>>gKy -T_CccC_T- j'55''55'2 )22#!"#46;5#535#"&53332654&#32654&#Kg>>gK -T_CccC_T- j'55''55'_HE77EH_+B\T\B+T.$%..%$.2 :32654&+#5'353326544#!"#46;5#535#"&533='55'1;AA;1'55'Kg>>gK -T_CccC_T- C.%$.llll.$%.T_HE77EH_+B\T\B+2 A462"764'72654&+32654&#2#!"#46;5#535#"&533P#.##.d '55' '55'Kg>>gK -T_CccC_T- T2++2)..$%..%$.M_HE77EH_+B\T\B+2 )27"&547&5463!2653+3#32#4&#'5#"375#"3Kg>>gK -T_CccC_T- j'55''55'J_HE77EH_+B\T\B+T.$%..%$.2#*4!#5&'35.546753#&'5>54.";X'1:-$[M;OTXIVGcV;&+&f-5  U )4:&BTVUSGF %QFWN)"o,  2 6#3265#32653#"'#"&54435#5!#35463"u.%$..$%.T_HE77EH_+B\ZZ\B+'55''55'Kg>>gK -T_CcTTcC_T- 2 634&#"34&#"#46326323"&=#3!535##5265ɥ.%$..$%.T_HE77EH_+B\ZZ\B+ '55''55'Kg>>gKy -T_CcTTcC_T- 2632654&#'326544#!"#46;5##335#"&533='55''55'Kg>>gK -T_CcTTcC_T- C.%$..$%.T_HE77EH_+B\ZZ\B+2$1>7#335#"&533!2#!"#46;5#332654&+#5'35332654&#TTcC_T- Kg>>gK -T_Cc'55'1;AA;1'55'Z\B+_HE77EH_+B\.%$.llll.$%.2$,E#335#"&533!2#!"#46;56462"764'72654&+32654&#TTcC_T- Kg>>gK -T_Cg#.##.d '55' '55'CZZ\B+_HE77EH_+B\2++2)..$%..%$.265#"35#"3"&547&5463!2653+353#5#32#4&#'55''55'Kg>>gK -T_CcTTcC_T- .%$..$%.T_HE77EH_+B\ZZ\B+2 .%3265463"#"'#"&5443265#5!#.$%.\B+_HE77EH_+B\.%$.ZZ'55'C_T- yKg>>gK -T_Cz'55'TT2 .4&#"#526546326323"&54&#"3!53u.$%.\B+_HE77EH_+B\.%$.ZZ('55'zC_T- Kg>>gKy -T_C'55',TT2.#3!2654&#!"&533!2#!"#463!2654&#TTd'55'C_T- Kg>>gK -T_C'55'CZZ.$%.\B+_HE77EH_+B\.%$.26#335332654&#!"&533!2#!"#463!2654&+#5TTz;'55'C_T- Kg>>gK -T_C'55';CZZll.$%.\B+_HE77EH_+B\.%$.ll24>462"764'32654&#!"&533!2#!"#463!2654&#!#33#.##.d '55'C_T- Kg>>gK -T_C'55'TT= T2++2)0.$%.\B+_HE77EH_+B\.%$.ZZ02.53#5!"3!2#4&#!"&547&5463!2653#!"3HTT'55'C_T- Kg>>gK -T_C'55'ZZ.$%.\B+_HE77EH_+B\.%$.2&'32653265%#"'#"&55#5!#?7&%7T7%&7 hIO77OIh ZZĄj&66&&66&%Jh>>hJ(cTT2&4&#"4&#"74632632%3!537&%7T7%&7hIO77OIhZZ&66&&66&j%(Jh>>hJطcTT2(#33!2#!3!2654&#'32654&#!TTgGk##kGDa*$88$$88$CZZCL*__*LCO)(OTO()O2 #0#5#!2654&#!#33!2#!%2654&#!353;)*$88$TTgGk##kGD$88$֊);CllO)(OZZCL*__*LCTO()Oll26462"764'32654&#!!2654&#!#33!2#!`#.##.d $88$։ *$88$TTgGk##kGDT2++2)0O()O0O)(OZZCL*__*LC2(53#5#!"&5467.5463!#7!"3#"3!LTTgDGk##kGa$88$$88$*ZZL*__*LO)(OTO()O2%"./#'.#523%+?n2(,Dn/TT! mT" +2@ ''7'7 hh gg hh g gg hh gg h29'2'2'2v'2's2v's2'2v'2j&[2&[22v& [z2&[2v'[&[<2&[22v'[2&[j2^5!5!2,,c;;~;;2^53533#3##5#5352x3$$$2ThUT5[oA2$$$KkXJEh<2  4632"&264&"'2#54&+$$$2Ao[5TUh2$$$K"0""00""0"bbRD`_Ef0""0"2532+#3264&#462"bbRD`_E"0""0QzPR}IhE0""0"2v"462"532+#3264&#&462"2"0""0bbRD`_E"0""0U0""0"VQzPR}IhE0""0"2|#";##"&46;462"|E_`DRbb"0""0EhImA}x{0""0"2m #?mp2m54&"#5462\HdH6ggm2HH2IggI2l753264&#"#4632#+#//# #8H38R84#(7:6p2l7#4&#"#463278/# #8H38Rj#(7:2m(3##2;:2lq#"&5463!#"26=p6:7(#4!+R83H8# #//#+2m #5326=3#h6B&46VFm70K>VP2mf(4'52#"&/&#"3&5463232680:<*,2 .%  ~E-%9 L2B<;@)0>0')2p>G-+?#2m  /&462"d]ww"0""0mp6Ή0""0"2m  /$462"2]ww "0""0mp6Ή0""0"2_ 462#"&3264&"2$4#$ 2$$$K2f462"2"0""00""0"2462"'3#"&=!5!2652"0""0QzPR}IhE0""0"bbbRD`_E!v462"3264&+332+!"0""0E_`DRbb$0""0"OEhI}x2 v462"#"&546;3#"3"0""0AbbRD`_E$0""0"OQzPR}AmIhE2X'"&5462#"'265264&"462"dddF-)&3F33F+"0""0Jvv FdddyS}}SF33F30""0"2(')"&6;2"&547#"3!"264462"yyFddd!S}}S^F33F3T"0""02dddF-)Ұ23F33F0""0"2X3#"&53265462"V;;^T"0""0-JvvJS}}S{0""0"2v 462"5!!2#!5!264&#!:"0""0,AAbb$0""0"N::T2v5!!"&63!!"3!462",AbbA"0""0P::.T0""0"2 #"&54632#4&#"3462"dbebR^FE_`D("0""0mARPxS :nB45J 0""0"2N 462"#"32653#"&54633"0""0D`_EF^Rbebd0""0"mJ54Bn: SxPRA2'/4&#"3254&#"#432#"&54632#462"oNRk<5oTs2I+L1VuspT"0""0NoTKLKy&S,$D=%emo40""0"2ev'/3#"&54632#"5332654#"326462"TpsuV1L+I2sTo5>hJ(&66&(&66&({0""0"2v (2#!5!2654&#!5!2654&#!5$462"Gk##kGD$88$D$88$D"0""0ڀL*__*LTO)(OTO()OTJ0""0"2v (3"&5467.5463!!"3!!"3!462"Gk##kGD$88$D$88$"0""0L*__*LTO)(OTO()OT$0""0"2X (3"&5467.5463!!"3!!"3!462"Gk##kGD$88$D$88$D"0""0L*__*LTO)(OTO()OTU0""0"2Uv.462"32654&#"#4632#"&54?!5! "0""0/"- uOGp1" TUA=frun#$0""0"(!-7aZ0*6&2Q[cQRZ\Ta2#&.%3##"&54632#52654&#"32>$462"aT\ZRQc[Q2&6*0Za7-!(c"0""0Yurf=AUT "1pGOu -0""0"2m 3#53#53AAAs22 22l v&#"#3632# #88'8(/# 2m1t46;#";2+532654&+"2,  m** mB+2/B-2 #z$*#zlDOop#y%6 #y EO\o#y%6E #yEO~o#q%6g #qE0*#v*#vYs#y'"y^ GY\#y'E#yWGY~#q'g#qYGY1"+32654#"'7#!2+632#"'32654&+ ! . '= &)B9/N"lppl%U1# +2")5#5632#"'732654#"'7.54632"32654&JA+ &)B9/N ! . 'gt{fl5DTTEBPP'E,*1# +2"(%V~}Qp[\on[^oY.#f'#fZGZe#q~"(C(p#C^Ze#q"(v(l#vZ.e#f((#frHZ\e#|((E#|tHZ1e#x("xrZCs#y)s#yI,g#q*&"qrJSq#y+F#y KS\#y+F\#yoKSo#j+F^#jK1&32654#"'7#3!3#!#632#"' ! . ']w]] &)B9/N%U;'L1# +2"1.4&#"#632#"'732654#"'7#3>32#C)@N &)B9/N ! . 'S%K8LYSk70aP1# +2"(%U0'MBtS=#x+F=#xpK\0#|,\ #|LB#j",v1"j"vO#v.:#vVNO\#y.:\#yqNO~#q.:~#qsNP\#y/:\#yOP\g#q 0\[#q 1P~#q/~#qOP.#f/.#fOK#v(0F#v%PKs#y0F#y PK\#y0F\#yPLp#y1F"y{ QL\#y1F\#ypQL~#q1F~#qrQL.#f1F.#fsQ&#|"2j'$#j&#|"2j$X#jt&#q"2C$m"ik"RCh&#q"2v$m"ik"Rv[i#v36& #vS[is#y36& #y S]s#y5EA"y U]\#y5;\A#yU]\g#q T;\P"i" U]~#q5~A#qU0m#y6""yQ V0Em#y6"E#yLV0m#v"6y"^#yM0m#g"6y"T#yP#0Emx#y \"E"yQ  ]Qp#y7@"ytW\Q#y7E#yW~Q#q7gC#qW.Q#f7I#fWUF#j8AF #jnXUE#|8AE #|hXU#f8A #fcXU#|"8vAp#v+U#q|"8jA?"jos-n#|9 "|VY\#y9 \ #yHY#C@:#CZ#v9:#vZo#j8:#jZm#y4:#y Z\#y6:\ #yZp#y;"yP [p#j;"jT[ p#y<&"yR \G#f="fT]\G#y=\ #yM]~G#q=~ #qO]F~#qqKB"jvW#zZ&"zR\*#^)D#yA\#y$*E#ymD##$*#D#f"$vm*c#v6##f"$C "C)#f"$*1##f"$|*c#|r\#f *E"fp #x"$v*|#v#x"$C*#Ce#x"$@%*##x"$|:*q#|r\|#x *E"xn Z\e#y((E#yoHZe#+((#HZe#|(("|vHZ#f"(v~(h#v;#e#f"(C"CZ}#f"((:#Ze#f"(| (a#||Z\e#f (E"ft S#o,N#j_\#y,9\#yL&E#y2$E#yjR&#c2$#R&#f"2v$v#vI&#f"2C"C&#f"22$/#&#f"2|"$`#|p&E#f $E"fl &#jb$5"j}c&#kb$5"kVc&#gb$5#c&t#|b$5"|~c&E#yb$E5w#yjcUE#y8AE #yAXU#88A#XU#jqAo#jrU#kqAo"kmrU#'qAo# rUq#|qAo#|rUEX#yqAEo#yAr #C<&"C0\ \#y<& #y\ #2<&#\ u#|<&"|W\0G" w>0G" s>0G" >>0G" F>0G" K>0G" >>0Gk" q>0Gk" q>" " & K" V" " T" W" '" VB'" `B'" ,B'" 4B'" 8B'" ,B# #?# x#.N" #<" #-" #9" #J" r DJ" tDJ" =DJ" ODJ" |DJ" [DJk" fDJk" xD# }%2" ؁%8c" %e" %a" %d" %T" %U" %," F8" F&" F&" F!" F(" Fk" Fk" F# }',# '+" '" '" '" '6V" 't2Z" 'p$" gL$" rL$" :L$" BL$" GL$" :L# {-# ~-" -" -S" -m]" -w2" `R2" hR2" 1R2" :R2" @R2" 4R2j" bR2k" bR# x2P" 2" 20YW" 2$# V$# V$# V$# V$# V$# V$j# V$j# V# 6# {6" 6" 6>" 6ee" 6TT" 6{TV" 6{0G# >0G" P>'# B'" =BJ# DJ" bD" F8" F$# L$" VL2# R2" XR$# V$# V09G"j 09G"j 09G"j 09G"j 09G"j 09G"j 09Gk"j 09Gk"j /# | -# z #  #  F#  M#  4T#  ,W# y 8" 8" 8" 8" 8" 8" 8k" 9k" #  #  A#  F#  <#  ?#  T# / U# 2 $9# D$9# E$9# F$9# G$9# H$9# I$9j# J$9j# K#  L#  M[#  NY#  O# S P&# s QT# d RV# g S0G"xn>0G"qo>09G"j T09G"j>09G"j U0G"|r>09G"j #xg#q" ̽" ׳1# ~tA 72>73#"=3} !1JL %*Oc2( tAB lG| yG# j8" X:"D9" YJ"|mD8" " #" ב#mV" %0" ״%S\# %RA#  BAh" E 9Gj'  "xF"qF*" F6" F"|F*l& F*#x' g#i'-" 'k$" א'bDAs#  QA" ] 9Gl'  2"x^R2"q^R2" >R2" >R28" ~N28# N2"|aR2k"R \ #x2 g#q2+" ̺25# w2# }/I"li  #'#5!#5A:aSES ISSSS"li  PC $9# `$9#V$9# a$#|V$9# "" ̟-<"" ט-<" ̧6F" ׈6$4# 6RP#vvAJ.8#58HH.8 18 18!518HH8!58HH8 K ?kA#5473]]00e{& P@3565#@]]00e{&RAh73565#A]]00he{&R@ #&=00]hM&{e0+'  1.'  /,h'  1.'  &O ###5353XXRUR&O#3##5#53#5353XXRRR3R2, 2#"&4{hIJ34IJ52IIhF,F|}Whs'h'htth''hWKy  $.9C2#"&46"2654&%3#2#"&46"2654&%2#"&46"2654&?WX=>XX=%56J55(BuB?WX=>XX=%55J65B?WX=>XX=%55J65X@=XY|X<5%&55%&5F +X@=XY|X<5J65%&5XX=%55J65B?WX=>XX=%55J65?WX=>XX=%56J55(BuB?WX=>XX=%55J65X@=XY|X<5J65%&5X "5>32&KY9UV9YY@9229@Y#73#'#D>>{y> 6' I' J 5[A!5[ANZ3#>2>y,!7;#"&=47.=46;#"%.49R.$94.%",,"V'AE>x&FE>EA'F; E <,!74&'5>=4&+532+53265m",,"%.49$.R94.%VE< E ;F'AE>EF&x>EA'M)#","M',"|&". #>7!5QJbFaJgcT{W0O ####532 mb@R@9^^LJJ@J 7".54>3!#33B`--`B 99RJDi>=hF@@V J %!53#5!2#3+99 B`--`RRJ@V@Ci?>iD(W" I?m 3##"=?hhi<#i hh4&&x;X %27#"&'5"5>32&KY9VU9YY9UV9YgY@9229@YY@9229@Y(W&  I<H' 'yy%3#"&/&#"#>32326+H>/-##5+O854$0 #91  .14 ;4X "5>32&KY9UV9YsY@9229@Y$a'&546276327632#"/#"/#"&54?&'#"&54?&'#"&463267'&546326q "." m! * $$ * "m "# m  * $$* m $$* !m "." m"* $$* "m "." n  <D'y'yy 1G& ' '  e<&yO'yO'yyg<'y'y'yw'yzyT<'y y<9 'yV'y&yy<)  'y& 3'yH'yaHya< 'y'yy<&y'y'yyD4 #""3265*LIZ/-inU[*bL)Q #533##=м.CC>; 5dF#632#".'332654&#"#7.&.BRXE%98I/56.1#4"4wO?CU, G4./7(G$4>32#&#"632#"7"32654&!.)5D8?14&C=OTA*45'(308W1 ;4@SN/L;>Q1()64(+1G #>7#5G$=QR,hm4H*#"&547.54632&"2654"32654NVCDUN#M<=LJH++H+$V44*,4"H:IJ:G"'1@?2&$%%.%&..&%F$#"&'33265#"&54632"32654&F!.)5E9?14)?>NTA'30(*558V1 ;4@SN/K<>Q.5(+23')7,Mh ##5#5353L.... S!5S.. lS & G G)o! 3#.546$YY$199 @MLN! IK-=yQ)+D >E8{8Ft*Bu8Q @*F A*G B8G C*H D*F EM FV T7 GV To Heol IKLl II(+]D:)+PH:)+LR:) 84[8)+N:)&A $*0#7&'#7.54>?373#&'>73'&''O 7+#7<8&9];7,# 7BTk=C Uv .t"OiKU@C[|6Y/_fO8((<\;~- e_L;I~ 9)4>32#&#"3>32673#". (>fA!RZi?8M$C( TTS q@f<(d2bjO4܊fO_;3UJgg3Ni`,3###535#53!!3SOOOOB77B7R793#3#632327#"&#"'67#53&'#53.54632#&#"&}Y;?!h(+*9J+#580e|nQ"e5>,X@M ,> 7(62Z'B8.%BW>6!!791![{ 1W9FFr&*3>32>?3#4&'#5#54&#"#7FM"K4a,#D0<7>58T'#T73.3HTY'1 J/*P*$W[ I;wi+5*27P9K GG#&)##'##5#535#533333##5##3'##3'3]N----ZO33O32fO::@@7FF]FF]]]]lUu[N3264&+#327&'332654&/.54632#.#"#"'#"&5#+#!2353CKKCVX5E7C$-4Y?YYX&0'1S6PDucz2> 14CiK]-jt8LZ>3 +(DOjc]x'V525#'+.14!#'##'#53'#53333333#3#'7#!7#;'##%#3'W97W5iZF78X3KL>;HG6CF1_nn\_2NNKW.eRSdcRUd?>,'wqI?))J??$k0".'#73&547#73>32.#"!!!#3267>g@/S7O?/@l@c^3K,DsExD)E9G-AQ=;;9QA/CI&d_;;\k"Y+##533333###]77]F%xngH**HgQ#5575575#5!#7]<F]_F_f_F_RR]F]f"8' 3654&#"2654''#>7.54632#b5( (Ghq;'jC%ZK:P[DG}R\F(%3."tssPu@. (! K[J8ecaM]'!&-327!%#3#+##535#535!2)&+!654'Q%42<fF]4444-Ql]3%LM10 0=F0D0}@=+[DZ "+3#.'>=#53#'#5.54>7_Blu2:xGPOxk 52J4 @;V@7T2 +<753#.'>73'b;(6N0;lh_8CL=`oy;YP~hd"=H;;*64`sG9DanT>   5!!### <ij]RRRR.!67 Z^O S$Mpb .!&'7! O_Y S bpM6m37NY3< .#"&'67>326D=0'zc$ 4GMi27<* / $zl #+=; >32&'7'67.#"3MG4 $cz'0=D6i3;=+# lz$ / *<72"y !&'67 OAbbAO $ bM^^Mb "y {wm $2654&"7#"&5462:-*@+X;7!.'>7*$!#=##=#!$* *$!#>##>#!$,+.*#??#*-,,,,-*#??#*.+rnT !>< sGJHC #dL*m ?PZH~#!5HHP~H)_'y|'y|yB|0!#5!#GHGgpB" !&'6702y#dd#y2781#ww#1JO###J>GO>GONN  v uG {I@0G {{637''7'7)E F-!()!-F EI':==:')34Af3#"#>32327#"5#"&5467>?654&32672#654&#"3273#".546::N< ZK8E.  7    07N]I.,@43"0Q8E='"#7,%P!= #A)&8 yC<>-$/8   1,0L   #2!R>,  $#1<+*1[2-,s)>0=Ay"#>32327#"5#"&5467>?654&32673#4632#454&#"#"&547332>54.1'.N< ZK8E.  7    07N]I.,@43"0Q::]J5A<" )3=7/(aP?G@(&,    58+C<>-$/8   1,0L   #2! ;Q/&  ( &!AM1, %0!4>32#.#"32673!".00GyL+_^W6+/:Z``!KwG/Md2bjO4NNej3Ni`Q"r&,3%,4>753#.'>733!5.4%G1JC> K K CI1G%/45n$GI3PP QC& Ob AC3GGO XFCW0(:L3#2#654&#"3273#".5462#"&54>2>54&#"::8E='"#7,%P!= #A)&8 y?L /Q2=K /P#8,(#7,>,  $#1<+*1[2-,sK<AL=)K<@L=)"0<+,1#0<*+20((?3#2#654&#"3273#".546#7#"&5473326?3::8E='"#7,%P!= #A)&8 y.7 ,  $#1<+*1[2-,s):*% # F:0mR+$#533.#"#632# 33267#KRR x^W^_+LyG0/GwK!``Zg>sNN4Ojb21`iN3!je~(o"r),!t}326?623>3232676;2#"&54?#"#"&54632#"'32767#.5476?#"&54654#"+"54632%"67654#!'\&jaG14tIc9#U( <^$:9L@<.yAP9K0#!$ ?4d+H\  VJ3.)%4$ i'!&j3bP0@73%Տ@6FI?fE3K8 FD60TkY[)& @">YkyW963 kUpD+-Oi27&#"7>32&'654&#"327#"&54>73254&#"#"'63232654&54>7>58A � *-0Me4(,6 # +#$! &8   Q`K N (2$ %D0R  +' W,!  -"p)EG,,6 0#"0(4 $  [n?A1M+ S+$!7)!8.Y 33###3#33俶7HH-H;'L6mm3>32#654&#"#T9/T8?HPTI/&Dd=T,$C;W &/`RVN>32#654&#"#?3U/T8?HPTI/&Dd=TzVWT H,$C;W &/`R?HR3:M>74632"'326?&547>7632>54'4;2#"&>K(DO4_'M*3&B';"#W?Z4dAJ#+?GaZ4% { !?.l#)# !J8)_DMW4>767327>32327#"'#"5463267#"&"327&">54&7B 46:EID]IAN>{W 61@6K'*@#VCw0gX@d) [{'D,D>%5V`">,- E.4!*3Ћ740XZB 91&q$3%2b,P;%c #  &qXz1$-327#"&54>7'7>324&#">  /)=@k/5 4"o #63P !#!E?Xt)a) BN;02'B )9LS.A#- K9vl?Q)!632#"'####5353353"32654&]9ihx|hk;KXTDDTXSBPPBDUS2VZCnn29999oooY^pL #53##`wXiX}'O</R.f133@8j&3X.4j-6%#"'332>54&#"#"&547&536324'326*L2m2!'8 1B ?,0(,0/+(((2sJU9!.ZR3.<'BD%IX$-M/$7\30CG.iWDjT*z>X8YG![i +#!2%3264&+3iq[-lugCKKCJJ]qoDxD&!('#"&632/7&#"327%654&/iVižg?.1;@54@85WO2:W3VҪq58*S9YN|w 2>54'%32676;2#"&54?65##"&54632#"'326?46367&#"3267>=4>32#"&547>3272"#"&#"6dDnnp*"0>+ "K]/ " OQ4""J>U;P/#!# >3;=[<{j@7BF%?&  m1&:8=vJ2 $ m y@'U%E/(+0i(GD2#qHnX'$<" wU f,wZO4 615 K:D()*H)/?NV/  !H23273#".5>54&#.54632#"&5332>54&#"[),#  P42(9#!&%O[aMLW*L9-YU$&&/ NF)M+.EP70 16'Ev`4' )?PuYGD, ?FrbK.J!> ]&*4&+326#&=4&+#!2#*LCJE +q:>Pks6H H6<`&0* ")8.IAC?e^>RS]0%.#7.+#!273#.'4&+326_ ]Pks6=!%\^" Hq:R8:GQJ#H6<]~$(037#&=4&+'7#!77#;2654&'7#_d6= +q:>y8",\LJED<88E8YLdX>R&0* ")8.IAC?^S'32#"&'"654&#"3"&54>3232732>54.#"#4>7.'6732654.9D0  1Z9FQ7S[06%*3& !8 .'++' 6!!  +J.S="1)! ;QJg %@j!E-! (2D8(.\=Bl 4Q-*A%!* .!<&%/ S7 / 4D7'n6  2[G %-%F O."mx74632"'3267>7&#"32>=472#"&547>327632#"&54632#"32>54'#"'#"&>54'632"327&"/"!$( B6;=IRL?yo96K:uA `5,7<" yVgm8'xQL5Any m5#7.54632677'"&464'327632"#".##"&">54&5467&)!!/2 LTs^V*!es!  &L'D1>A   V %P?$85BQJH CT!$N% 5 1aE 60!v$'* -$+-?#+A  Y   Aqk^1  +.?Q0(H %#"&5463232'>54&#"D._p;Iqes 0ZlCV# %S+lL=v=j(H$&R9-Zc74>7&54>2#"&54632#"32654#"632#"'32>54#"#"5>32#"&4#"326-9WGazRe3&Y* !D-#S|+X<%3$?%3R.N=1Y6 a'N _1##>zJ216o+X P ]+J>TP JND3/.@:9^6 =n+/ "2OF< )S}74632#"'32>7+"5467>763267>32#"'"547#"&4>3232#"&#"32654&5463#"&>5&#")0#!$ +bV:@z R *&,3?&  $'#C!t 7(/gF`~TB? C@GW5A\{ p#4-;@"@;_K&%!=J;!.&A5,2 537!.n(>aM'M4MU!5{>"Gz#E !))ln7;>7676332>7>?6332676;2#"&547>7#"=>7#"&5463632#"'B: *Y:s IV<k "*1 v-/G-o  Gl'+-?IvF-47B@Ca"Z[4#"+g $ E3###3#/%2#654#"#"&547332654&/.54>::XXH+VII /C"?n:=KY'+{$,-V~ t'( N8. # < '8-!JA 2.?-" # 5" #7,!} ) E[#u# m{[#u"t mE_# A _# A"t m_# A"u m_# A" @ mE`# B `# B" A mEa# D a# D"u ma# D" A ma" C# D mE"{ md,d#,,d#,,#,,d#9,9]#,9s#,#,9#,#,#,9d#;,;]#,;s#,#,;P/0&Y'K0BLBt#LLBR#L#LLB#YL  Y #LY h#L#LY F#L#L#LYB#[L [#L[h#L#L[DOFGFP  !&'672y#dd#y281#ww#1-; !#'67&'P81#ww#12y#dd#y21 75!&'7'6712y#dd#y281#ww#1-;x 367&'781#ww#1x2y#dd#y2!!.'7'>7!.'>7A82%6/^66^/6%28AA82%6/^66^/6%28DCF @6a00a6@ FCDDCF @6a00a6@ FC!%'>7.'>7.'7DCF @6a00a6@ FCDDCF @6a00a6@ FC]A82%6/^66^/6%28ABA82%6/^66^/6%28%#654'327+(t1 X"qS@(Sq"X 1 &@ "+ &@03!&'7'67!#082y#dd#y281#ww#12#!&'67!254&# NTVI2y#dd#y2}i36G;DD1#ww#1Q#+-"3!&'7'67!"&54663i}2y#dd#y2IVT3+#Q1#ww#1DD;GZu3!'7!#7[nuTpoT !67r#y28v#1 %!&'!2y#1#v8b\ \@#_G 8@  - 8\  Hr@ D!  r@ X& V !!!.'>7QQHM)B\[[\B)M~5PP5b!QaVVaQ!b'7'>7'#'#H!QaVVaQ!b5PP5m)B\[[\B)MHQQ-'7!5!7'!5!'7)MHQQM)B\[[\!b5PP5b!QaVVa,<z.'7373!QaVVaQ!b5PP5)B\[[\B)MQQH!'7'7!.'>7!7'!8L(PXRRXP(LL(PXRRXP(xTToT}_"`^KK^`"__"`^KK^`"VVV'7!'>7'7.'77'7H!QaVVaQ!bb!QaVVaQ!bPPPP)B\[[\B)M(M)B\[[\B)M0QQQQ /6%#"#".'#".#"#52>32>3232>;&'7'6`w:<=92), (#7A>9;<9D= (#4g2y#dd#ygNc bP>I>"854Oc bPcc#1#ww# 73#3#KhxcMx'N+%2#"&54632.#"#>"32654&#@G3!ez_i:QL.> X k]@JP=>RR3R^hc~O83WbSGCW[DBSZT !5!5!5!!5!cdLRR'R# 32654 &#"3#"'#7&54632JVtWqnFi\טfMJrYטh*FJuIqjg[NsfY 33 ! &d)'h !#7! d3Y'q7h!".546;#!!;~Es\3m-IP4!FyRFF;Q)F7!33#3#;#"'#7&54677#?t7}B76Y^E7%u.p }AGFFF[tM b-74>;#"!!;#"'&-&5B1*6. l -9%qJ$7W1 6 B/62C 6j27g )Ig7&3#7#537#537&'#5323&>7t7%2ZqD7[q><2DP?4 >/H@'tNQxF"<32&#"32>7#".'#"&54>32.#"32>d+)H!+.#  ! i)   &6$M,#g7"9|1Jd2>32#"&#.'#"&54>32>7.#"2654&#"  !"!'<N9 5*+(*9N;3-1    )11-1)       !0*5Y& Y5*0 = ! ^dH! !0Ee3VSZsS BLd " E Ed V" E# E E_  6%654&/7#"'732=.546754632&#";P+%U$- 'N8%<>! ^(: BEdH! !0>H W&<  >/&/ zJYpEe3V ,6+9?A7.2")Q8?J,23 ' A8?::F/;1+#,!%! J@3 7#7'&#"#>3273326=3#"/E/571*q@590'*NFK!%:E*$"t PJ(m & 2 JE( &7#7#537'&#"#>3273326=3#"'!!E;tT7/571J9@H590#(AiF$NFK,e !%:EvF2$&  J2,#7#537#5!733#3!"#>32326=3#"/&E!=C3273326=3#"'3!!!E?c5@N/571`)@6 59024= FfF2NFK8Pk!%:E bFfFIp& J JnI,:7#7&#"#>327'&#"#>3273326=3#"'326=3#"/E\ /5715I/571]>@L 5905>590'*=,NFK_/NFK7o!%:E `$!%:E'35$"#>7>2#.'.267>73"&'.'3C[Z# Z[Z "Z[" [ZZ # +5  5+  +5  5+ 2o &  u2%!#7#537#53733#6K6*3K3*FFfFwwFf(Y & 2& 2% 2(  %!#7#537#537#5!733#3# .K. (K( FmmFKFKF__FKFK- %!55% v8CC3EOO- %!55-5v8CCxEOO- %5% %5% vvEOOEOO- ^ ?367>73#.'.#"##7#>76?&'.'3323lKE+" %?&U5 "Z-FKC1# (D&Z8 #Z- +5\5+  +5Z5+ - 75%737'#?-&@K0hJ0K;/E|r,O;ZOhsApA-3#75?'57YK@]OjCCCCBj>-!!#7#5375?'5737TSK.KD>GKR$yElCCCC=OKfOtAT1.".#"'6323275% $YLF%()|!YPG(v.//P/0bEOO.".#"'6323275-5$YLF%()|!YPG(v.//P/0bEOO-752$7&$-|mTqgkxIfEs\OL@DJOZu- gC( [' 2: g( \' 2: h-752?367&'#7&?-MK651\;!3R3`vGKRo "EK#)OTP<4OU7)-33"#756?.'567&PK[qeCK+3.Z8#2Q2^u$ $*EMe!'OQS<3OS7]7X!".546;#;~Fr\3'IX9DwRFB\2F7X mIX733#;#"'#7&546;7Xo-0BP? 0F99FbJ44FBFF߄6."3!!#7#537#53&+532654K@G^K0Oc=nyOK/F::F.F(F-tV( !&'67%3 &=33265/!RCffCR!pHHfdK&!fQaaQf!ƃba4,%!!!!,MGPH v|B:' 2= vB:' 2; wE7 v=-@E7 z|+ 33##5#53$264&"6  i66A66^M+ !5!$264&"6  ~/6^M+ 77''76  264&"''''╫'&&'+  '264&"6  H&`>&`JM+ 2#"&546$264&"6  &$$&%4$%(9MLq"!!#"F"F"D" !l!#!5!F}&\F%!5!3FFFF\L"!!#xF"F"L$$ !!!!#nnF$FpF8>>-5%>H}>>7->H+~>!>' 2\ >%>' 2` !##3XXM = =%#".5332653M\^MRYaRL``LXS W. 2#"&546&$$&%4$%(@m 373'7@))j(ii(6||L}MM}> ?'%%5H%%ݚok Bk( #367&'!!#7#537ȏ7K53.\:$4S3axV5KYxbnc5 !u!'OSP=4OV7F77F(ELx( $33"!!#7#5375>?.'567&mK`h]UkvK#B=<75I)9V6f~#$EDF77F&.O06C>7OZ8YB:33#!!!!#7#537#!!K3:^']%K%,P'wsشfGHNFJJFNVcB:%!#7#537#53!5!733!3:~$K$+O.}y-K-4.FFHHF\GcHZZ\c' # 32654 &#"#"''7&54632JVtWq$[\טfa%aYטh*FJuIq#[g[b%bfYb!##bFFmHe##5eF'F_|333_FmFIf)533fFF4 4632&#"dH! !1ZsS BLd6;&#"'7325;%<>! ^&Ee3V;XI %"5>32&KY9UV9YY@9229@Y;XF ::#:;((:03#;;(((8T #57>7T_{RJ(R:b7(8z 3#(RR (JT #.'&53T.:R(JR{7b,8X X8X  ,KX! YX8MN#3#LLX8 #L X M 3# 5L78,O X8,  7 ,  X4;$#;U$?/1%/8)/)3/6#/2+3/7,/;6#G/()/7,;=/4/1(G/()/2 75/$0/&.=/%"/(/`np/6h%weo/+v7edkq//y)ddp/7d9xdap/)d)wfo/&r5fbxq/6t6jdo/6r,dO/(//,'1Y/';/&&Y/';/&&Y/';/&& Y/';/&&?/$/.1%G/1/67<Q/(3/7,%?/&0/$ 1lwh/(o0tlD/64/8 %[/(=/61&a}p/)w6i`}m/6h*p_}p/5w6gb}s/6j8{bnn/6q3bY/';/(%/  !"32654&'632#"'#57537BPPBDUS9ihx|hk;K??SBoooY^p~VZC2@2zN3@%53!53G0HHppk/1FM / #!3##52672#"&546"32654&%54&#"#546322#"&546"32654'.sG/3)(0=T@BW=Z) Wҕ՘bTl+r4 QK.=.-97- ?ST@9P<Ւӗ!l\|c'-#2>M#67>32#"&54?32654&+532327654&#"72#"&546"32654'.66@&=PDQTC32"32654&2#"&546"32654'.3)19 L;LS>%C!M+en)67*&//ҕ՘bTl+r ^Q DSAE\'9nb<(1=.3C<15?EՒӗ!l\|c'-# %!#>7#72#"&546"32654'.8SYDmMҕ՘bTl+rH*yib\Ւӗ!l\|c'-#"-9H"&54767&54632'"32654&"2654&2#"&546"32654'.UUS/HN<;I)Q&..%&1.+)46P41&ҕ՘bTl+rnX72#"&546"32654'.-'=9"4*'>T.*R),-,K4IH4>4IH42&g2 !!!5%!5!%5!!52DPD6PPPPPFFpFF2j@2 #'+/37;?C%3535#3535%5##3#3#373535#35353535#3535!!XFFFFFFF*FFFFFFFFPPPPPPPPPPPPPPPPDFFFPPPPFFPPPPPFFFFFPPPPFFFPPPP2 % 5#'5'35!!n4XFaG2D25~IX̌q硡Xᚚv2m2@2  $(+.26:>ADHLPTW!#7'#77'73'7'3'7''7'7'7#777'/3'7''7''7'7/7'Dgw<^;;z=c@?@jF@FX55{=b??xiFEF#F@F@F@FFF;;y=c@@@$@F@E@E(@@@>>D2<;;=@?@iF@F55>@@#FEF#F@F@F@FFFL;;$<@@@#@F@E?E@@@M>>f35'3#PSS/d !!dX d !5%!!X/A&r@C&s@l`!!+` l`!%!!"+0k0 #Z)Z#Z% !33xo %'!sxEe/b^ x^ @^ y^ @"x3 0{@^ /x^@@] /7-3Ռ#Zx}#Zy}x.{^  >^  4> xs /{@^  x s ] /}$ gg gg$% gg?gg$ %'7 gg͎gg' 2#"&4>"3264%2#"&546_d`x|ّԕPa`=컵Ք՗ # > ttT88'"3264%2#"&546 x|ّԕ컵Ք՗' %-39?IOU[agm3#654'&'7'&'7'&'7&#"5632"'52767767767%#&5473&'&'&''67'67'67=< 8 q*  KQ+ 8 << : s-KO-: y KQ*"5 8k;;8 q,  JP. 8 d 8 p-' #(,2#"&54667&67&'%64ԕwZZ!!W!=Ք՗j] Z B & Xn?BD=' *"32654&'2#"&4>"3264%2#"&546IqnILklG_d`x|ّԕprnJJp:a`=컵Ք՗' 2#"&546ԕՔ՗'%2654&#4632#"&vyՔ՗.x|ّԕ' '@'5@' #"&54632%"3265!Ք՗uv|Uԕ֚z{y'"!#"&54632v/hՔ՗xԕ'"&546.՗ K^ !"32654^hII43JXIhII252"2#".5467"32>54.%!!JNLOLOSa^]^^]]ADRLLQTJJ\^`^]^]^D2[ !#4&#"#2!462ʋcr˒(vt2a ']#463"c<֙x]7U5@g 'o@'] "#4632#.w<֙<wԓy'g R!RDDRR@RRRj@2, "32654&2#"&4<,,+~hIJ34I- +* !]J52IIh2!%!!,vDX2D2 27!%!!a[vD.\2D2 2 !3!%!!c/vDXX2D#Z #5 !hw"hh3#Z%!33#Z7! >e3>j "32654.'2#"54$㖛f`ck22 !!!!!!2D2X2DE\E2@2 22@' 2#"&546!32654&'ԕ~j  q|oՔ՗8 j.pys '@' '5@jO%!572hO2@f@jO!%!!M2jO!!O|X !%!!4pH$p|X !!p pjO B?_ 654> 54.''#"547&'#"&5475#"&547&'&/.54>75&'67.5467.'>7'>54&'GSRL#q 08"5"( ;N$V&[&-2F >3'  x))[&V# ;,.'6:s(2". U_^T%  T`acMUTH)xnABp`L_ P #-(86C# =**rY-{/r2)T"5 ] ]#  04 T*1r0{,4G=:J-?xIWP!LJ "   LMpB@n~YT"O$%3!56767#"&54>7#"I(,C$U,T 4R5K,FJHGKF-K5R4P* 8vPJ5-J=BkCBjB>J.5J#:.'.5463267632">54&#"#".'&\Qm<+U>U22F=W6E1='5?&DJF.84?/ 9KOY/?VK,6"8T;8pW/F4%KFR 7(/hX[c/398 /!*J"0 &'67>7.(8F!JE;;8-0>P<6jj1?0#8!5>7#"&54632&5462>32#" ".F--F/! O&@\S;""']]'  ;S\@n%%9%./$:#,"(_CA\ 82?ZZ?28 \AC_"OC%3.'32654.'3263!56767#"&54>7#"=!28"L2.@,740 ??;%@.K((,C$U,T 4R5K,FJHGKF-K5R?('t?.!7&//O09Z40='.?J4P* 8vPJ5-J=BkCBjB>J.5J#>32.'.54632\Y6=W5QTMQm<+U>w0JFT;6phiBKOY/?V"0 &'6(8F!J0>P<#/h%3.32654&#"654&#".#"32>!5>7#"&54632&5462>32#"!28"c`%G<$vLB44A2.+8!?D(.%  ".F--F/! O&@\S;""']]'  ;S\@n?('H538 l6&DF$e#A37G )(H%9%./$:#,"(_CA\ 82?ZZ?28 \AC_7 %#"&46323B,-BB-3"S%..J.-7"&46323#54'&BZBB-6 T&\%..J.-7mC88m7#"&4632#"&4632"F0/FF/:#F/0EE0:"ks&--L-'&--L-b75%#"&46325%#"&4632wF/0EE0:"F0/FF/:#=='&--L-ځ&--L-Bp #"577>324&#"326p;W_&(  FNW%'30;b,C|R0  VO7&'32.'>?/&54654'2>2%2367>7632327#"&'&/.'&547#"&'>7&'>;&5477654'4?&54?&472>54'#"&'#"32?632#"'%>7.#"327'&547.'&'6324654.'.#"3263232654&"#"'.'&'&'&'32?6=#"'>7>7&54672>7327"&+"327>32&#"54#"+654.'676794OgB/4PB6*'#C  / Fs3IJI    +b] i ),/KImL W!+a>E,' Y3q2VU U (%#   ([]DZ A'$04[,  ).P() -2>c`* f8''j)6 -M01$"" 8 9+ "# vpn #AYI[ o#,&g!!jV0D9'0*A   H ! E"   !   :## H% G " # O0:/B4G/93NF W  >FH    *{/ ) N !!" %5T Em*a &x18_ Mx'+26LL 8< de ePd<ddH !# #7H@__[$lH )33'__[ll$H )! 7'@𼌌ll0462"$462"#3\+>++>+>++>PPy>++>++>++>+0!# #3UUUc033#0UUUc(H !!!!!PPPH 35!5!5!5!5!H@PPP(6#264&"462"264&"462"!5!"."".qPpPPp"."".qPpPPp,m.""."qpPPpP.""."qpPPpPLPHr3#3###53#533蘘Z蘘ZPPDP8PH ! ! !iVKJWH462"462"462"t+>++>+>++>++>++>M>++>+>++>+>++>+H ! rKxW80 66  >4&8[Rd|lU080iT/8/jt>|fQm[=|dH462"462"462"462"H+>++>++>++>++>++>++>++>>++>+>++>+>++>+>++>+0p3# #`__$<| 3#333#!PPP`DlDH3#35373#`_P_`ll#4@462"462"462"462"X+>++>++>++>+>++>++>++>>++>+>++>+W>++>+>++>+H !!!PVWP6"462"$462"$462"*+>++>+>++>+>++>M>++>++>++>++>++>+:  %5-5%m8=UrKVrrVK0p)5333pPPx<< "3"&632644#<||ޞ||ޞP++>GPP>++>+?g &5467%!5!32654.'XO<mKIf^]g&?4_`v{aI~,PP6]B@L=I,D'6F264&"462"264&"462""."".qPpPPp"."".qPpPPpo.""."qpPPpP.""."qpPPpP80264&"6  <6<704632'#"&"327'7654&7⛟UL8Lh}zcS9>j⛇hL8LUȮy>9OgzH 3###3!8PPPlD<462"462"462"<+>++>++>++>++>++>M>++>+>++>+>++>+8H'$462"462"462"462"462"+>++>++>++>+>++>+>++>++>++>!>++>+>++>+>++>+>++>+>++>+80462"$264&"6  j+>++><M>++>+6<7046327#"&2654''7&#"7ݠhL8LUݟ}~>9SckUL8LhݍzgO9>y8'/7%462#"&54632"&547&#"327&6264&"264&"PpP6SX)%UW9PpP$ y~ $O"."".""."".8PP8,F'ᛠ%H.8PP84)~y)K.""."z.""."6r 3##5333#PvvPvvDPDPH 3# #3(`__`$ll8B264&"264&"462#"&54632"&547&#"3533##5#327&"."".""."".qPpP6SX)%UW9PpP$ oaPvvPas $Q.""."B.""."98PP8,F'ᛠ%H.8PP84)pvvPvvm)H!3533##5#!!PPPvvPvvP0 !!*(uH7!3!3PPP(< '%<w..BB6#5.5353>53#4&'#5#46wPjPiPPiPjP a@r q@` `@q r@aH3#3#'P_`6+.5353>53!!#4&'#5#4675!5!wPjPiP$܋PiPjP& a@r q@` 8P8 `@q r@a 8PHr353!3PP .575HTHHTHFt%1264&"264&"%2"&546!2"&546'#5!#3!53m%34H44%34H44rp<3%$34$#43%$34$#4<<<<Ft&19A#5!#3#3#3!535#53#532"&546!2"&546264&"264&"?r%34H44%34H44q<<<<<<<<<<q<3%$34$#43%$34$#4MF^2%#"'#7&54>7&'#"5325332?373327^5R.($E8A":!D<a?VC4B!;7>謬DA,=3,` .F!3!535#5&5#5!#32>5+Xo@C6*# :LS H<<2<73#3!535#535#5&'LS ӄ@v9&*# O,bD<&<<<;> <<<<<<<$F %-5=46323>32#"&'#"&5467##"&264&"264&"264&"FR:2L L2:RR:2L 00>RtR>00 L2:/B//B/B//B/B//BtR>00>RtR>0 L2:RR:2L 20>B//B//B//B/B//B/F\5=EM462"$462"#"&'##"&46323.54623>324&"2$4&"24&"2((((R:2L L2:RR:2L X0>RtR>0X L2:/B//B1/B//B./B//BR&&&&{tR>00>RtR>02 L2:RR:2L 0>B//B//B//B/B//B/F326=33!53#"&5467I4D<}})u4Mlw_?`):e>謬F2533#3#3##"'#"5325L<,E E<٬<<< >>謬F:D#"'#"'#"54675#"'#"532532536532>53323265)9= =H%DOOe,E E<<>H9 C^t?[>>謬o#2992##29=A,-6eMFJT$462"462"#"'#"'#"54675#"'#"532532536532>53323265(((()9= =H%DOOe,E E<<>H9 C^t?[>>謬o#2992##29=A,-6eMF!#"'#"53253253353#5#,E E<<>謬]CEFR1"#43232>53#"&%#"'#"53253253353#5#>謬]CEF 573#573#N<<<<F'F'F3##"&546;!5#"32655Q>>>N=Q< (!6-E9j9E-l-E9j9E-6#J_3333`J+1"]k{{k]""]k{{k]"( FJ09B%#"'"'#"&53327&546227&546232>5654&"654&"Q>>>N=Q< (!6-E9j9E-l-E9j9E-6#2(2(J_3333`J+1"]k{{k]""]k{{k]"( JzIaaIzJJzIaaIzF>#$462"462"462"#3!!!!&&&&&&<<yy((((((D<<<F>$462"462"462"#3!!&&&&&&<<y((((d((D<F [>54&">54&"#5##333327.546227.5462;333#5##5#"'"'+*4*n<<<<<< 6-7n7-l-7n7-6 <<<<<< N>>>>N )6)FAAF)6))6)FAAF)6Dž"#(A)f]]f)A(#""#(A)f]]f)A(#"'3333F4=2654.7253#.#""&54>7&#"#3>326! *.* !)k<<n.6-' DrD '-6.n<<k)N>> ,(DCCD(,9+';S"2)(d__d()2"S;v+933F3333#####5 <<<<NN<OO<F +32654&#"326=33!53#"&54632#"!4"8FI4D<}})u4MlyK+9H1>c' t):e1``'L~:CG6&&&&n*[D?`*o>;‹ZzzZ/\yMKIOF@IR462"$462"#"'"'#"&53327&546227&546232>5654&"654&"H((((EQ>>>N=Q< (!6-E9j9E-l-E9j9E-6#2(2(&&&&0J_3333`J+1"]k{{k]""]k{{k]"( JzIaaIzJJzIaaIzF#"'#"53253253353#5#3!53,E E<<>謬]CE<<F/$462"462"'#"'#"53253253353#5#3!53?&&&&,E E<<<<<}}&&&&d>>謬CE<<F'#"'#"53253253353#5#3!535##533,E E<<>謬]CE<>QtAHHAAHHA,G+/8SG[5*+6gD+*>>QtAHHAAHHA= F Y%32654&#"#"'#"&532653265363232653#"'&''767&=#"'#"&532653265:.2"",E ED?<R<R< ?+1H)" =%">QtAHHAAHHA,G+(4J59>G[5*+6gD+*>>QtAHHAAHHAF% BٷFr GQ&#"32767632#"'#.547&'#>54'#"&5463232654&#""7 "d\CC\3`);H1)0 !00H4( ;QQ;,,H8+# 0)1H;)`." 7=^+ 3:EE:~J1+G8D-paU ]Yv0SF$HH$FS0t`R !`Zs-D8G+1J +F"*264&"462353#5#"&5467.264&"EfEEfii2<<3ii.&'-532>53#"'#"&532>532>53#"'#" -:- < -:- 53#"'#"'2>532>53#"'#526=#"&5332>5463"7%- 7&'#"5325332?3327#"&((x((":!D<謬DA,=9X.+?|FB462"462"462"'4>7&'#"5325332?3327#"&T((x((x((":!D<謬DA,=9X.+?|F\3632#"&=#"32654&F53#"&462"532653#"'3"&54654'&'#"&532653654&5463"64=8r83#264&"462353#5#"&5467.264&"$462"462"<32#"&54>73264&#"=H<( h9dtU|=VR/iFVOK5`8Gd6Q9KUuKYwCY:NafQsF#+>32#"&54>73264&#"462"=H<( h9dtU|=VR/iFVOK5`c((8Gd6Q9KUuKYwCY:NafQs/((F"*2<53#5##"54635#"'#"532532536462"462"'"3265<>謬oJ((((K.-6eMF %"&63"#"&63"ӕ~ӕ~<<.<<.<F+73264&#"5632#"'%&#"327#"&46325O;SUllUS;BLii+'F;SUllUS;BLii+'& )H) ?MxM z )H) ?MxM zF33##"&546;#"3265<53#"'#"&53327&5462'654&"!( >N=Q< (!6-E9j9E-V2(1+J`33`J+1"]k{{k]"OJzIaaIzF09462"462"2>53#"'#"&53327&5462'654&"-&&&&^!( >N=Q< (!6-E9j9E-V2(((((1+J`33`J+1"]k{{k]"OJzIaaIzF1$326533253#"'##"'##"&53325hT"27&'#"5325332?3327#"&":!D<謬DA,=9X.+?|F,!4&#"##"'#"53253253632#4&#"632,4<,E E<<<#+4S>,4",4S 66  >>謬hT> 66 WT>F#$462"$462"##"'#"532532536((((Z<,E E<<<(((( >>謬F1,5>"&546323>3"32#".5##526733254&#'4&#"3dt\Q(:38 Vkf#,thAdt\Q(:38 Wkf#F3@qOK3@qOKOqK]qEeLP-3212bej)u+=HODCQQCDOH=+u)jebǵDEJ?T0-u'&'&-&'&'u-0T?JEDFp-2#"&'732654!#3!52654&#"'>322bej)u+=HODCQ<<QCDOH=+u)jebǵDEJ?T0-u'&'&x[y&'&'u-0T?JEDF!2>532>53#"'##"&5 -:- < -:- 53#"'3!53d+FTY< -/8<8/- 532>=3##"'#"&5$462"462" -:- < -:- <<-D]22]TY &&&&.RD))DR..RD))DR.'/;yyY((2&&F6%-53#2>532>=3##"'#"&5$462"462"<< -:- < -:- <<-D]22]TY &&&&'.RD))DR..RD))DR.'/;yyY((2&&F3#3#3!!!!F<<<<yy'<<F@%"#43232>53#"&3#3#3!!!!(!//!:RR:0磣</B/32"&6264&"6264&"\\\"Y}Y:cc:Y}Y<\\\^\\\N[[[!92~:00:~29Y\\\[[[Fj08@$462"$462"264&"47.4632>32"&6264&"6264&" (( (( \\\"Y}Y:cc:Y}Y<\\\^\\\(((([[[!92~:00:~29Y\\\[[[F 1<G73265"4&#"2>#"'#"&547&546326324.#32634&#""UoKj5<"UoKj5#"'#"&547&546326324.#32634&#"((0((>(((("UoKj5<"UoKj532%3&"3&#"@<@)R1<;1%:FE{}k/Q<==<#/E/9sssF7273>7&'#"5325332?3327#"&547&'#"'<A :!D<謬DA,=9X.+?|Q"%5>F !#"&54733273%u8Ml\PpI4F<]Bpknm):GF4/264&"!5>54&#"#46323>32#"&^^^*i66J.75<\LKi;,T |Q[[T|^^^S!K'46$;@!*;LY^%A.6 <OkpFb /5%#264&264&"32+"&5467.546"3r=&5432654.#" I <+-dB!!H) 1%$1<H."d I +!E#o!!G=> ]Yv0M;: !`Zs-!!oD!+ F #5!#3!53r<<<<F 2533!#"'#"53255#L<,E E<٬ >>謬cFv353#5#3!53##53<<}}<<CE<<BFFv%$462"462"'353#5#3!53##53((((9<<}}<<&&&&CE<<BFFv##53!353#5#3!535##533k<<%<<}}<<XBFCE<32'>54&">32'>54&#"462"1?oxATyQ*+"HVv|qMY K3ZOk5TyQ*+"HV;ek&&{+0F"eN8H *6)4C)J;O C+?%eN8H *6)4Cp]1((F46323>32#"&'##"FI3+C C+3II3+C C+3:fI5))5IfI5))5F+  3#篮 kmF1462"$462"% 3#&&X(( Z&&&&.mF  !5!!53'!x<<}ڂ'bF)2>532>53#"'3##5#535#"&5 -:- < -:- 532>53#"'3#3##5#535#535#"&5 -:- < -:- 75#"'#"532532537#53265OO%N.1,E E<<>謬;";&"-6eMFR9D"#43232>53#"&#"54>75#"'#"532532537#53265>謬;";&"-6eMF733#5!#353#5#3!53#F<}6}<<}}5}<<}}<<}F5 <"3265$"2654'##"54635#"'#"5325325332#"&54Jh((,6..UOOe,E E<<<0<<30< K.-6eM*(*)*F^tAe>>謬oI64GI7!F33!53!333&

=&5432&#"!&=#"', I<+-dB!!."d* I f_Z1%$1D!+ o!!G=> !`Zs-!!o +!E?F ,7&#"654.#"353#5!6=&5432327632!&=#"' I  I6b<<`d<+-d#<1%$1 +!ED!+ CE!!oo!!emmFe%##535!5!3##<32#"&'##"q&&&&I3+C C+3II3+C C+3((:((fI5))5IfI5))5F<(08B2#5264&+#"54635#"'#"532532536462"462"'"3265:RR:!//!OOe,E E<<<*((((Jh((,6HRtR>謬oJ((((K.-6eMF+$462"462"462"462"7#5!#3!53d((((((((r((.((((.((<<<<F5$462"$462"5##"&532>532>53#"'3((,((2+FTY< -:- < -:- 532>53#"'3462"$462"`+FTY< -:- < -:- 532>53#"'3`+FTY< -:- < -:- 54&"327&5462327&&)532>53#"'3$+FTY< -:- < -:- 532>53#"'3`+FTY< -:- < -:- '/$264&"462"264&"462"$264&"462"^;R;;Rw^^^;R;;Rw^^^&;R;;Rw^^^R;;R;^^^bR;;R;^^^R;;R;^^^F(0264&""&5467.546232#5264&#264&"EfEEf3ii.&'-ii2:RR:!//!EfEEfS~JJ~J:PSrrS5XX5SrrSQ8RtR#2::42:p0F)3;C3253253#"'3!53#".54632#"'3254&#"462"$462" 37{<#2::42:p0?((((F;EO267#"&54632#"'3!53#".54632#"'325374#"326%3254&#"/73 5;824<&:%T'}}'T%:&<428;5 37{<444480 :24::2&;*0*<<R*0*;&2::42: 08.00F\;264&"264&"#"&463235463"3>32#"&'##526=/B//B/B//B L2:RR:2L UR:!/[ L2:RR:2L [R:!/B//B//B//B/n0>RtR>0:RRtR>0:R32#"&'##526=##526=/B//B/B//B L2:RR:2L R:!// L2:RR:2L /R:!/^R:!/B//B//B//B/n0>RtR>0:RRtR>0:RIa53#"&3!2#5264&#!#32#"&'##526=##526=##"&4632/B//B/B//B L2:RR:2L /R:!/^R:!/# L2:RR:2L B//B//B//B/20>RtR>0:RRtR>0F?GO5463"35463"3>32#"&'##526=##526=##"&4632$264&"264&"R:!/aR:!// L2:RR:2L /R:!/aR:!// L2:RR:2L p/B//B/B//B:RRtR>0:RRtR>0B//B//B//B/F4&#" 632'6/!"(;23#"&5467&'!#26'3."EfEEf4 ee 44 G&.ii.&G (BZBAXA~JJ~J23#3#"&'#5367&'!#26'3."#26'3."F4 ee 44 GF 44 ee 44 FG (BZBAXAAXABXB75#"'#"5325325373265OO%N.1,E E<<>謬;;&"-6eMF$462"462"7!!!!!!((((vvN((j((=<F1<462"$462"%#"54>75#"'#"5325325373265>((0((OO%N.1,E E<<>謬;;&"-6eMF!264&"&"32"&5467.54632EfEEf fEE3Jjii.&'-iKI3~JJ~J,#J~JtRSrrS5XX5Sr6FR7"#43232>53#"&264&"&"32"&5467.5463232"&547&#"632"&547&#"3!53<15"0"&JKA5"0"&AKp . *!//!>1 *!//!<<<F?462"$462">32"&547&#"632"&547&#"3!53((((p<15"0"&JKA5"0"&AKpf&&&&= . *!//!>1 *!//!<<<F7>32"&547&#"632"&547&#"3#3!535#53<15"0"&JKA5"0"&AK . *!//!>1 *!//!<<<<<<<F7?G%3#3!535#53>32"&547&#"632"&547&#"$462"$462"<15"0"&JKA5"0"&AKb&&&&<<<<<< . *!//!>1 *!//!<&&&&F#,5$462"$462"73!53322654.2654.k&&&&ªp54.#">32'>54.#"6!2'>54.#"<:00+&D, }XE500+&D, <200+&D, }W';*((-=%4';*((>/W';*((-Fe:7?G462"$462"#3326533265332753#5#"'#"'#"'462"$462" ((((<<<98=8898=89&<<"]1-dc-1]((((((((& eLLeeLLe% ____((((F3<'264&"462"462"462"$462"&\~\\~{{{,&&.((N((_~\\~\{{{E&&&&&&FN5!5!264&"462"F*{{{ؘ<7!63232>7#"&#"#"547>54&#"#4632!654&#"#463263232>7#"&#"#"Gv%3$<"    &3f qE=C4*=NeZC4*=NeA(W"    &3f f@!Q2T   N 88 e,;VJ!:myT):<';VJ!:myT"Ul>x   N 88Fk&.7@43267#"&547'#"&54737&3265732654'654#"hu7Br%J" (u7Br&"Yu7B<\(pv=V=QV=3\MXE0 < DK\MWG0!\MnQq$B533273#5#"'#"'#"'#"264&"FВ/= = &<<"KNMK!"ShVoooВhIh"*484**48 6666MbIoooF7'7%3!53#5!#%'7'9>44?}}}6};?44>lll<<a<7&543267#"&54732654'654#"32654'654#"'h(u7Br&H'(u7Br%%i(u7Br%J" (u7BrV=QV=nV=QV=w' DK\MWG0 < BL\MXE0& BL\MXE0 < DK\MWG.5;m)A;5;m)A;5;m)A;5;m)A;FGPYbk462"$462"%#"&547'567&5432>7&543267#"&54732654'654#"32654'654#"0(((('h(u7Br&H'(u7Br%%i(u7Br%J" (u7BrV=QV=nV=QV=X((&&:' DK\MWG0 < BL\MXE0& BL\MXE0 < DK\MWG.5;m)A;5;m)A;5;m)A;5;m)A;Fz92654'"&=.547&#"#4632632#4.#"26=3=:=X\6EpE4D^'-!( 32#"&'$264&"264&"[ L2:RR:2L L2:RR:2L ;/B//B/B//BO0>RtR>00>RtR>0?B//B//B//B/F\'/7$462"6462"'#"&46323>32#"&'$264&"264&"5&&&& L2:RR:2L L2:RR:2L ;/B//B/B//B&&&&0>RtR>00>RtR>0?B//B//B//B/F\,'/7462"462"'#"&46323>32#"&'$264&"264&"&&&&c L2:RR:2L L2:RR:2L ;/B//B/B//B((((0>RtR>00>RtR>0?B//B//B//B/F '%%X =Hf{GH{RF$462"462"'%%Y&&(( =H׬((v(({GH{RF/7>32'>54&">32'>54&#"1?oxATyQ*+"HVv|qMY K3ZOk5TyQ*+"HV;ek{+0F"eN8H *6)4C)J;O C+?%eN8H *6)4Cp]F/7632'>54&">32'>54&#"<<2353#5#353#5#"&'##3%#26'3."#26'3."4 FG 5<<5 ee 4<<4 GF 4<<4 ee 4<<\BZBAXAAXABXB[/2ZddH]]HddZ2/[ddH^^Hd3::o188A199m2::F=CIOU462"$462"367&'##533>2353#5#353#5#"&'##53%#26'3."#26'3."((((3\ FG ]<<] ee \<<\ GF \<<\ ee \<<BZBAXAAXABXBZ&&&&[[/2ZPdH]]HdPZ2/[PdH^^Hd3::o188A199m2::F #3#3#A<<<<<YYXFR!"#43232>53#"&#3#3#5332653#"'#&'#"&5332653<-&<2?<55332653#"'#&'#"&5332653((&&<-&<2?<55332653#"'#&'#"&5332653((&& ((&&<-&<2?<55332653#"'6462"$462"462"$462"0]wSZ<532#!12bej)u+=HODCQQCDOH=+u)jeb2YO=DEJ?T0-u'&'&-&'&'u-0T?JED<<FA$462"462"462"%2#"&'732654&#2654&#"'>32#!&&&&u&&2bej)u+=HODCQQCDOH=+u)jeb2((((d((=DEJ?T0-u'&'&-&'&'u-0T?JED<<F=462"462"'2#"&'732654&#2654&#"'>32#!53#5&&&&2bej)u+=HODCQQCDOH=+u)jeb2 <<&&&&=DEJ?T0-u'&'&-&'&'u-0T?JED<F-2#"&'732654&#2654&#"'>32#!3#12bej)u+=HODCQQCDOH=+u)jeb2<<O=DEJ?T0-u'&'&-&'&'u-0T?JED<F%%3!53#"&532>532>53#"'+FTY< -:- < -:- 532>53#"'&&&&+FTY< -:- < -:- 532>53#"'YR6&&&&R+FTY< -:- < -:- 532>53#"'3#+FTY< -:- < -:- 532>53#"'353#5<<+FTY< -:- < -:- 532>53#"'!!#"&535#35#'35335 -:- < -:- 32#".543264&#"J9:!D<謬:&IWuKYw7[8W%)afQtFX!75!5!F<<,<<F|3# #IEzyE|,F`753'773#''7FC4CC4CC4CC4C>d(L"(*!//!5QO7Qk>>d(LF_327&5462#"&/4&"327&5462#"&/5#".54623275462327&5462#"dN&"0"51+,{{N&"0"51+,?35"0"&2@ؘ@2&"0"53B!//!* *W{{WB!//!* *" *!//!)tllt)!//!* F&33265332653>53#"'#"&53&5>53&'553#"'>謬U, $F0%654&"333#5##5#"'#"&53327&5462;`2(<<<<<<"N>>N=Q< (!6-E9j9E-6"JzIaaIzS'JJJ33`J+1"]k{{k]"F $462"462"462"!!!&&&&&&&bb&&&&&&<aF 573#%3#'5N<<<<F'E'FF@2'%632"&547&#"632"&547&#"3!53Q5"0"&JKA5"0"&AKpT:hG7 *!//!>oD1 *!//!<<<F#5!#!2#5264&#!3!53r:RR:!//!<>謬{F !!##PS<'F%#32>%!#"&'#"'3!5332>5d~( 4F*) '*'p<( `P38m>謬]<F74&"2264&#"'632#"'3"&547&=.5462"/B//B7//7@AkVIWa?T1+J`##0>RtR>08B//B/=:=X\**^TCDQ^'-!( 3232>7#"&#"#"5.5462Q&&&&RtRRtXH"    &3f IavvaI((((tRRtR    N 88H qJSuuSJq F$264&"%2#524#524##"&4632tRRtRR>>< qJRvvRJqRtRRtXE Eqn325654&#"#F<)u4Mlw_I4D<ـFc3232632"&5467#RtRRtXH"&   &3f IauuaItRRtRT  N 88 qJRvvRJq F/462"$462"264&"7"&5467.53265N(((( EfEEf-'&.ii.&'-54'#"&546326/B//BA@7//,0>RtR>0##`J+1T?aWIVzB//B/\X=:=* L2:RR:2L *IC@L=Q< (!-'^QDCT^*F15=654.#"3276327#.=#"'#'76=&5432&#"Ё I<+-dhH) 1%$1<Hhd* I D!+ o!!}Ӏ3 ]Yv0M;:3}!!o +!EF!%26=3"&=.5462264&",!@!32&54>32#53D!$MNHMP$MwR9?!H!57UB$,8& PP9 $ DYHH-3O@*,   +?_;>/%2 JLbm#%7'7&54637#'75H?1c>LK&II@7:/mke6$;B; AB&eLm!$"3###53%7'7&5463753=I$1MGM31c>LK&I0mke -).;7HH7#;Cf>&/173:>2>7#"&5467Y6   CL_bN\LD  :hj3!eb)4&#".547323267#".546&<(*2,2MS1 O_?/ C/G#^"5  !$ " +=;/QBx  :8QFY5QM'%  5&&_. $'2'32654&##5.+'676753VG E`\)H.2'[A!M)?E)#RDP(#$*GN70C33S{7253#5.#"327#".54>1G33 c$7B &"1(H$C%c.5L0 5$,@ '(f#2#".'732654&#"&546{ #-Uc#k3='I] <r4#53533##5./>54#"327"&54>32=>?&&3>>3?[C"/># .!-% !/ -;P3DD3,HB , :(&,*!.#'3##5.'&/753632&=654G4;E  491,$r^.31*1vZKW(=>E_/**"$*GD(#<%253#5&#".546V.H$33=_%&+><21_P *1(#CAB%m%'673#5.# ) JIg43Q+0   54'#"&543367B5oXO34P- (0" 0!'!C   LE;H_b@L3 4"668& #90.#"#"&5473263253#C PYM.9S 6 2833( W6-( -32 *ia%'63253#54&#".#"#"&54632 33**!" .9E%0 (  $*(-7,*@."*2654&##5.#'>75#5!#2#"'7%25"h <"3$4M(/RLJB5'$1@ wB'*&/5('33T.*'; -q7sl)33##5./>4'#"&5473267>;C3<<3 w/4D 5#'+!-$4CU>3+]2-.6-  &- 6 .,253#5&#">32'7>54&#"#"&546(G.33Iq%E!-8)A&2 J&U-.'$8, $&%8K!9 1!'2[>.'275#'47#5!##5./7#"&M   V 9P3[6 6 4(L     33./@:&p.,547#5!2#"'3267#".573254'#"&72654#y6:1, +":#_5_>%34b6U)2*4'(+"ZMT3,#2940_yHjv1 :jI,=8%E.72654'&'"&'#5!#he97GW2Jb+  @33"558h.73265&'.5#5!#3}1rrF #c2!?$~<]'m33 9OP`.1C.#53>54.##"&=#5!!3232'".'32654'CB * $W3:J C$6> !5  m0;  3+R3< +733 -B ./467#5!#3"'327#".'732654'#"&l'f 3 $7=G:'>) 3PE($"("3J 33G* _57T<-0+!,m!675#5!33##5.'#5.#7Ps(3>>3 3l4] ] D 3 /T?3u?"Sc, >%:<O2#"&'#4.#&5473263254&#"27#"546327>"3254#"532654,!I"?3 4?54'#53&5472654'lF~c :'7G}v4'* 9*13.Q32*9*2=*S-8' 3?6+2%M7<=2Q#Q.$"&=#5!#267#"332654'$8!$^C*3 !:"-?6:!33}6K&4d82R<-G'!3.7"&5#5!#32654#"'632r2ER (I  & n5#33 |& (0 C %;2.#"37#".54>#> f$8C .- ;;-*Qk.5M/>.,6& mm-33##5./654&#"327#"&54632:+33::3 $ 3 !=-,;*8R?34# 7F 5!$05 W3$"753##5./7.54632&u  Vm:32L8B*"  d(6&4/! 053=252-"( ? #!z.'5#5!#6?#&54C+G1*k`CV? 3 *339 (&+/).1.&#"&546325!5!#<6!(E5<^3 v)2+M3K.K9#>3253##5&''654&#"72767&#"KK;\PƓ2 (+8"?!J_T3:  ( 5 & /.*#"'73254&##5./67&'#5!!532')3l*<&I8/. ,2$%=0g21%11@ /!%033(* #<7.675#5!##5.#"75WmI/3 q(0!Q $KxD!33?c : "..24632&#"32>7#".'32654'#"&'5!u '    %4O:-K0* 3h=(1%<)4 1  (>?P#3SC1 jv:-@:33. *4'#32%#5!##".#"327#"&54674\# U:ea,)#G7 $*4,753309)5))30#(L.!##5./67.+35b-3h)!=,V=.#DZ4.36/;)8 <*>A5QM'%  5&&.%25!5!##5&#".#"&54>326 O3&)+#$$$3 4"*-%Z33>?$7( "E$)/).0263253##5.'27#".'#"'72654&#''/ #!7j3# % 8- #/IK[334 0 +#,1!&30".!327'654.'"47#5!##".x/b1a4rk7 $%Y( MK$33-;X ,J.%#".'#"&'6732654'#5!!3254':(4 "<6 " $78$=",6(3!'@* 33$H8 ([\.%)&/32>54&#"&54632%5!) (z/,"2 5%"H!'.W([6'37 ("1 ,X332}.(2"&=#5!#>7#".'32654'4632"" 3 !/!-*0L) 3e7,=$Z$+7~33{CC#$9" 8NbC u@#!K$:.'7"&5#5!#32654#"'6324632#"&n -@Y0A+a_ 7 !33"g+ '$*@EM. #74632#"&&+5!##5&/675O /CA \532{ +/0P>(( B336Q )-m(E(5QM'%  5&&7.7.'7'675#5!##5.#"75D++DWmI/3 q(/!R $L9 0 6"D!33?c ; ",'233##5./32654'#"&4732>54'r=Y3ll33P]+ 4]?? 9/( 0GC=W3&-!?2 JJ3Z0H..'5!4.##5&/7'7632#"'7326Bpk/&3>(y&)djF4Lf< 33#nAW6P!4#>#=>G83, ;X.7.#'675#5!##5 /AT&yg4,~X:<*6g&+33: N6NFo.4&#"3"&54632#53## R! *5'72BC3[? (&/733tY.'463&'7#53##54&#""&5& 3>wC3]+ ' )(3 .>3 333oZ((.47#5!#'>54&N2;ACZ+3xK833G@EE0 )! .>B2'65.#"#4&#".547326324#"327#"&54>326%5!M*9!#)/3=TFRD )7=&Q7-%y# +SaU7uG' &(09+'{9F0/#)( Z63,/"2)/# L3D06`*.33.(L1#B%''5NJ Q4A.#"#"&547326325./>54'"&547326733##wCQLZ/EF<4686q4)$1( ,(74#"#"&54632533##yCM /E#.DG 6 28V^!F O",&"'*& N  WC9M.3CC3' --$1 *;) *<7#)"5"% $%1^5HM3.+=.##"&547326325./7#"&547#5!##27#p#l1D.*" KN &Hc<3&   34O:0% L3 2>] (R8,33 $ a0 +.-5&#"#".547326325#&'#5!!#2654.'o+( t "+.*" ^KL=7(3(Lg9 ;(.' P1e33=() "%+? 8 7<.KW.#"#".547326325򂂮./#"&=#5!!32&'#2654'#"'}C J0E#.136E$"1'-4TEQ.##"&547326325#"&54>7>54'!53&5473##2654'r   g 2C.)# 33=EV2 Q6& 00ƯE 3r7F<"G/P90% L3):ZD N= 3\H8J",O63o.BA!"x@TV>NAqY.>.#"#"&547326325#"&'332654'#"&=#5!!3267#DPLZ.9S 4 56*3m3b[;RR%(F^K3r' M@'. *32 +[3'&?.33S2lF&.:.#"#".547326325#"&5#5!!>54#"'632#p#y "+.)# ?D 3 .q,.3' :&.' (&3 M/733q \&"!<5>./!!4632#4&#"#"&54732632&#"327"&5͘6 3.*>L, Vx'&w  >%.39!-]B4]I/A*3$"m&$ -VU.GK.#"#".547326325#".'332654&#"&54>32#5!B Q/D#.DG 7 83%.":,'3  $2BLF57 + 8&Kc33Mvu' ,.), '<) *l0'F+R'*7;X/:\IFa!#'" '}>33B.#"#"&547326325&'&/67654&#"327#"&546233##xCL LZ.EG<46PB`,p'@7) ? (V~Q]$iJ4QQ4<( M@*+ .;) +BW68;"*$3- 2DJ=7Q(ZX3.+3".5472632&547'#5!!67&'" '0!1-Hh'#* d.e,-.(5*f@*/:!3:gV2"33!S|^P "55:.#"#"&547326325./7&54632&#"753##yENYM.EF 6 46FkMq_<+( $yR3yUwW2) W6), .<) +EFL)[E/(8 DJ3325!5!##{B OYM.DG 7 65"5- "!4>)b3|P3m' W6), *<) */:'' , '&D2;(f33c.H7326325.#"&54>323>54'!5!##5."#".5472*"  9; ))&)H2 $k>j3 k "*.'3 -" !2% ,,>33-&54  ;'0%   s1<.#"#"&547326324&''654&#"'>32533##267&#"CPLZ.EG 6 462$%.# n6F3VV3 # S34 ?2( M@!4 -<) +) W"&!$ $1PE3 ,+R)!.>.#"#"&547326325./67&'#5!!2#"'73254&##xCL LZ.EG<199b($fp3@&69tMh," K94F' M@$1 *;) *IA] %M#6@33)9&1,&bNIg2 1 #3=.,3726325.#"'675!5!##5.##".547  8"z@4#:/ #*.) 2" H,6`-+335 ;'+* (&3{I`!!.8<"32>7#.##".547326325#"&54632&%5! 9 !1- -!49;$1C1g7aD0;3%: 3 !]#"J5214B "U>0!+$+_33hA.FJ.#"#"&547326325#".'32654'#"&54632&#"3267#5!A MLZ-EG 8 38 %9bC:"9%T,P"5R3O)4! K%3!%33MXc' M@*+ .;) +w1Jm_:Q?3Z7?#00):2G #!9 D833=.18.#"#"&5473263254&#""&547.'5#5!##5|C H YM.EF :56`#/*U.C AML93?59.( W6+* *;) +5+P,`)%""33B73N.'5.#"#"&547326325./67.+5!##zENLZ.EG 8 46)9-9Ye n>4a/:R#-2) M@!4 .<) +;CR 89CG33bN/- /jM.#"#"&547326324&#"327#"'#"'732654&#"563263533##ENYM.EF 2 56P%!, <" 4#I5N3QQ32) W6), .<) +Ms/6 +:')01=8k_  $W3.*.5.##".547326325./67&'#5!##5&'o#g #*.)" BdE*g-~IF3LI;0{V2 ;'+* (&3 /]G:%R#A33b{(?+7q\.6?.#"#"&54732632.#"#"'73267.'5#5!##6325CPLZ.EF 7 29 :(20A,- B_853@5"'2n' M@*+ ';) * N4?4j" EK7"33a84E.FN726325.'#"&'6732654'#5!##5."#"#".5473254'}   2 "<8 " $7W33   k "*.*8$= '3!'@* 33"<4 ;'0% &'3w$H8%P.:>.#"#"&547326325&/32>54&#"&54632'#5!zDNYM.EG<64_:&9 VB0d/7kY&4y{' W6'. .<) *Uy79!(# )7#$*9,JZ9o2Zq!!33.)-4.#"#".547326325.#"'675!5!##'~CP/D#-DG<19:!~oA39V0 %& ,-&- /;( *%-6b++33@>e X,q.)18.##"&547326325.#"'675!5!##'.'7l$;.2D.)#: !~A3X_:,n6(Z%O:1$ (&3 o-6b++33v&Q . I7QHY*.M`e.#"#"&547326325.#.'474.#"#474'#5!#2#"'73254&#"#25".5#7#3FL LZ-EG 8 38Q*  R+&69'j$044"  ,4 38a?  S3 2( M@%0 .<) +h5F 1#2  Q 33Y.!1&/ &,*4\D8 ,0)U.D%'675765254.#675!5!##"'#7254&'#5./7&',EX.4"kP*-D !4XlGq' %+!O3)"M."M.(,"m ?   [X5-33. Q>" 5$,3#3Y%( )0" V67723##"'73>54'32654#"'632#"&547./675#5!4&#"#"547326c' 'Fy52\,0!K  Y8H%%P #'Ks93@<(2 DoW1 A/DRkAY)<3!7!H, F^iH8#Q*&%4[54'32654#"'632#67AC K55 .

 H&;$6 .*>,C"<6) 1&,)#.$&<4G:)1050*0! 33.LT2#".'732654&#"&5475.#'>75#5!#2#"'73>5654&#6'25"7!0 "D-7a:#32M*.;!"+ 4Q( PT'; 6&$ 5$1@ u!0'*2"B_OGP85)9+/5*33.'*';)#oq7O.SW%.#'67.'32654'#72654&#"&54632632#"'7654&#"#5!w#) JR, 1.(!   *433b= >!)0%,*@,G"A4) 1&,)#.$&<4G:)1050*0!&;:#33.Ya2#5.#'67.'732654&#"&5475./>75#5!#2#"'732654&#6'25"A K !0 3S+!"+.Q132M*.;!"+!/U( PT'; 6&$ 5$1@ u !0';2,0#! FVGGP85)9,05*33.'*';)#oq8F._c.#"#"&547326325#".'32654'#72654&#"&54632632#"'7654&#"#5!EOLZ.EG 8 46371('   *445ʅ) M@!4 .<) + .*>,C"<6) 1&,)#.$&<4G:)1050*0!&;33.NV7&54675./>75#5!#2#"'732654&#632#5&#"#"&5473263254#"'25"&+$*W( PT'; 6&$ 5$33)1@)L--" 6 '-7z1@ uw ?25*33.'*'; )#6&*#F2$6 / *"(<q8.ah.#"#"&547326325#".'732654&#"&5475.'"#'675#5!#2#"'73>54&#632#25"zCOLZ.EG<643;5^=%32M*-<%+1I(B'< 6&$ 5$ &34=<v' M@$1 *;) *&>[SGP86(4+-54633.'*';)#&>&iq7zT.7>&#".546325.#"'675!5!##"'72>54&+#0?^&+>,RH@zw9F0/")( \22)7! *3&#Cc-/6`*.33.(L1#B%'7L JX/M.8@65654&##2#"'74635.#'>75!5!##4&#""&'25"^*/5Y1[%'&$-/W(PEpV3B#''P1@ u3 "8@2T=8;$!"15&33@ )&q8T.EL726325.#"'675!5!##"'72>54&##4&#.#"#"&546x4& (@zw9F0/")( Z72,'(#-74'#5!##"'73254##5.#.'474.#"725.'#7#3c6 'j1"#4"  3Q*  R+&3)?!? FDS3 n 33Y)1&/ &E|5F 1#2 V$878L=0)x.HUZ&#"&546325.#.'474&#"#4>74'#5!##"'73254.##25'.5#7#3Gg6)KE#3O-Q*  RJ'6'j1"#4"  ,(3BV? +">S3 ?7/G'6:9[5F 15? !33Y)1&/ &  Um@8U)0). )-d25.'#2654&#"2#632#"/'#3'.'#5!##5.#"327#"&547.'#"&5463.'#"&54 '/"/<3M >) OS#C  fR<kI3m+  "4!&&+'!A)'*?  i=9)!* 5 < 338'^ /)0 -)#!&.!;A675!5!##5.#"#"&'732>7&'2##"'732>54'6!S395%,#5*!/ NS> BG # V._a]9idR'33l0#)3@ ,R.A/<'  <Z' K4&#"632%4>32533##54&#"632'>54#"#"&5467654#"#"&Zx=UBSB,>*y>3RR3S>`D . %' O$U:)E!?;|eL 5+1!rY3gPlh"% $)+&9G   .A25!!67&547'5&#">32'>54&"#"54>yPG.}e,7d-Iq09"*+ #& ! J8-.'3!wCq8Nmx72r<6& $'! $   -D+18{GQ4632533#632&5474&#"#5&#'675.#">32'654&"&25\GaJ1@23Cw2K"0!?)+ (  '$fJ 9,g-* 6PnM3UQUbCdE) Am@H< -03-1 (!  #"U' ) :%8{MW].#'67&#'675.#">32'654&"&54632533#632&5474&#"#5'=2SU*!9M7X2K"0!?)+ (  '$fJ 9\GaJ1@23  Jx2,f-0:.5@H< -03-1 (!  #"U' ) =6PnM3OWqFCdE)    -+9+{L2533##54#.#"#"&546326325&#"32632'7674#"#"&5469M.3CC2#- .%$ -07#)"!E( 6)%1^+{=2533##5&#""&54632&#"32632'7674#"#"&5469M.3CC3=_%"/>,.H$V^!F O",E**8+ N  W15HM3< *2(#C2107#)"!E( 6)%1^+o{:@4&#"3"&547&#"32632'7674#"#"&54632533##'32#R!  *&V^!F O",E**8+ N  WC9M.3C3l72l[? (&"=7#)"!E( 6)%1^5HM3t7l.927#'47#5!##5&#".546325./7##"&& !&')3fO=3=_%&+>,.H$JN&H $ #a0 133qP *2'#C21$AZ (R8.>DR#"'#'654&##5. #'76?4#""&5467&'#5!#572>747474+' ;Wi$:/3  ~#k%3'4 *nHU cK:d c 2'i ~x50%"*2  3FU&$!334F&Y.[am.#"#"&54732?6325. #'76?4#"".546?&'#5!##"'#'654&##572565474+];2QH* ?A  )5  ~$k&3" * -fU(:Xi$173hK;d c 22(W6%0 ,<)+!  3F U&  33%i ~x60$0{5H%.js47#5!25!##"'73254&+##5.#&/4>?54&#""&=47#"'3267#".573254'#"&72654#725'.5#7#36='3 3#  ,4 3Q*  H7$ %7#_5_>%34b6U)2)5'(- 8`B+">R3ZMT33Y 1&/ &,|5F     -;  #2940_yHjv1 ;iI,=9% ^B8U)0).KT.#"#"&'#".573276754'#"&547#5!25!##"'73254&+##2654#"&=47#"'326732?6325.#&/4>?54&#"725'.5#7#3A 6?W 5_>%35b5*2)45F'3 3#  ,4 3~())$y$ ":$_,C?38Q*  H748`B+">R3"'81Hjv1 54'"'#"'3267#".573254'#"&72654#63f *(<44Ld3TT387p4(0 %7#_5_>%34b6U)2)5'(- ZMT3A4?JJ>`V3R-1C*5)!#2940_yHjv1 ;iI*=9%1_g7>54&#"327#"&5467&'#5!##"'#67.4&54>7#"&'732654')58"%(2 k#@64 ( =MHk-4    $O3="-}$B">' 3!+22 %N!@%2kyHY+    R=.'; -+ .:CP47#5!25!##5./7##"'#"'3267#".573254'#"&72654#27#6B<4MNG%7#_5_>%34b6U)2)5'(- P!M82ZMT33A>] (R@#2940_yHjv1 ;iI,=9%/ $%4a.3<Il.#"#"&'#".57;67654'#"&547#5!25!##2654#27##"'3267326325./7##"D)EW5_>%34b6  .)2)56=<4'(- P!M82*%7#_HD? 2 46MNG2'?6Hjv1 ;i& !,=9+MT33)%/ $%4a#2940_U, +0>] (R."O2654#7567.'#"'326'47#5!##54&#"#"'#".573254'#"&('(+"?4<+/"O $. >":#684`#$%T3%#O5_>%34b6U)2)5%963M$3 !#0 9MT33 .!O,B%Hjv1 ;iI,=9nP.1:V47#5!##54&#""&54>3&'#".573254'#"&72654#7#"'3267y6hC3]+ '+(+5_>%34b6U)2)5'(+",*":#_ ZMT33s;Z(* / Hjv1 ;iI,=9%9 * #2940_7(  .!*07265&'&5#5!!2+&'52654/&/#2qoJAb!;'9(G"`&$,\4 i7k}=]$3&0m33=,'+J 3C8 $ 3H +.6AIO.+532654./#"'#&5#5!!;26722654'#"'3265&'5#_AmS."C`z;GVx _1u?AbD=#) NC1 1rrFe2]&S)$7='4[2@]Eg&0m33@ZK&z$~<]< /H +.GRZ`.#'67&+532654./#"'#&5#5!!;2672&'#2654'#"'3265&'5#G  JP, AYlhGVx _1u?AbD=#) N_AmS."!/4C1 1rrFe   > *0C0<4[2@]Eg&0m33@D2]&S)$$$K&z$~<]< /H7+.Q\dj.#"#".547326325&+532654./#"'#&5#5!!;2672&'#2654'#"'3265&'5#xC L55 .32>32#"&'#4&'#&'%4&#"32654&#"5326if0C GQN5+'W@5o "#!)=b*7%B3"- ,0g*^3=c}o H$5a/W2% $-b+ @33@?%  S x$ )!`QE]A' 4&7-gBO-yQ xE67"+3%.,5.#"&54632+&'#5!!#2>54.': +="6(K=+4K/+n+c=2-* 4#bDLg*9#7 /G =7<09N33=&(Yi $.#u%2654'"#".57"'327467#5!!327327.547#".'327#"'#".'&'73254'#"&( #~4 $7/%:)>! @l7J 22 7$:@C1cF 8!;& 3/L$&B!  1#4`M8>.K 33GQ =Gf%=#`O (!+(Z2Bm#-!@z)2K..M"67$.)%'2654'"#".57"'327467#5!!327327#5.#'67&547#".'327#"'#".'&'73254'#"&,J( #~4 $7/%:)>! @l7. 3Q,!K\2 7$:@C1cF 8!;& 3/L$&B# !  1#4`M8>.K 33GQ =,J73 *0K.`O (!+(Z2Bm#-!@z)2K..M"6G{.OU%47"';2?#5&##5654/67.5332654'#".5467#5!!3276 @.29 , +201#<9S(1$;# ,#2S;?C.9Up+' 0, S) r+".9L7  e38+CMg9%*) ,,*7*33!3# )T.1FO2#"&'#".'&'732654'#"5467!5!!63254#"';2654&#"&'32696)'P S,BQ0L-%)(7 =/e5}2M<^06@%1'B/D61K65k@$2N7> h @#/~&U33)P`CY5:232537632%32654'#"'732654&#"iF$cF.=",M("PG !"3)32#"'24&#"3254'#"'7;26&'32qz/34+44(#ve A1,?66c- @!<^H&4.1.&0"((.l2&?M5E/Q*  )|- *O!@r''' E4 *A!= ,B)2+5;HB=!7)-"?9LK6m( (6C)$ !0^v327#"./32>4'#"5?>5'.'#"&54632>32&'&=467+"'3254'#"'7332654#"> +!- & :]/2 h; !# ,I!  $8&P;+*8#>"#! H$%" X,#<-* .*)[yV/) N*0Pj9]s *B_>7  9 '.1X'(+%%. /^6?(W)++C.  - #8!1- $o%7'72654'#"&5432654&#"2#"'#74'#5&/67&#"#"&5473724&+"&54632>L7U.h*}1 )9d_80:)/4%!*449?[0 ! DT$,A?iP .m &;.))&E! K*+BM #< $ t\A-7/>+5 H/F\9,/oS&C8M; Bw. '6:>f$ 'G%#"'732654'#".=#5!>74#"&5473723!32654#"'632P#?*\.Lq!?6.)y[5G!* a3D/#;T *"))/&-( (*! 3 5 <1) $ / E3 37q9-$!B2H;'d.#"#"&54732?6325#"'732654'#".=#5!>74#"&5473723!32654#"'632#g>2RF* 7I $ .3(:\/KrD6.(\5G"* `4B0#;T (!")$3(V6)+ '30*#%* *" 3 5 <1+ $ / G1 37q9-$!B2L*.o 'I4&#"3".54632!32654#"'632#"&5#5!654'"&5473723##Q"    5'73;d&!"-:c4,'d[[3G!*a6AB3[@ (!/76D$"1'6vS?'O3 2 ?/) . F63t5n{FQ%"&=!5!632533##&#"2632'7674#"#"'#"&'332654'7&547#326!#C9M.4BB4T`"DL #,F)+8+ T 0E:qu30M0?32>54''#"=#5!#3267#"&'#".'732>54m !730)%&7 #R^1~ S-6aEH_1W/2MI</5 0 $ȇ975e;"2)%:(7#6333T]4BzH^0IJj !0)"o.=4&#"3"&54632!32?67#"&'332654'#"&=#5!##6Q"  *5&824 K(R6m3b[;RR%(C3[@ (&07-2l7?+[3'&?.33t ='L#".54>3253>74#"&5473723!32654&#"'632#"&=4&#"37 % :&#? [8E!*4/@b  "'KC/(h[B , 5#,6&.,c 5 ;1)  w 3I %"nO=(s_M h'm.#"#".54732?6325#"&=4&#"37#".54>3253>74#"&5473723!32654&#"'632#D6/E#.EF56;5/(h[B  % :&#? [8E!*4/@b  "'K(3c',.*+ *;)+>=(s_M- 5#,6&.,c 5 ;1)  w 3I %"n8F $U4A".546324.5473##"&54747654&#"3732654'y &E3lB99<8ͫwW6ca*#)Z[c2$ET"* 8%327 %N?i4#6K&/ %&)*.$ "/(" ='(5h49K #`v\ &# XKA>$ /E% 1 )FDZ,!.=46325!!32?67#".'332>54'#"&=&#"&7*.5L4 K .U6RL33 >GV80I$S%#40!(%7;n3-2l->2$Gd_&aM/ *<2#*@3;[h2f.#"#"&54732?6325#"32654'#"&54632654'.+"27+"&54>327#vC  L[.DG( 46%3i4#6K&/ %&)*.$ "/(" ='(5 %3c'LA(- .;)+ #`v\ &# XKA>$ /E% 1 )FDZ*417.IZ%"&=&#"&546325!!32?67#5.#"#".547.'332>54'#"'32?632(4/!(8)02L4 K3C K55 1A3 :FT?/I$SM4FmQ 325!!>54#"'632i 32ZB  &"2(2F` 36% ,./7#6cL0 5",@ H$3q 6X2&"!<Y?r;327+"&54>32533##5.#"37#"&54>3254&#"r, )F>)3& 3__3f[B L!1)1GY$-H>3^+1:('c3w!icM/=B+@ H$+w4?o{=%2#53##54&#"3"&5474&#"327+"&54>32533#;3C3Q" *$Y$-H, )F>)3& 3,,4633t6@ (&"3+w4<>3^+1:('c3J.04#"./732654''254&"&54>32%5! cM 71=71832%5!*"Mm 33R,!(v^7186u) &.X*Y?31 ZD.++  5 %09&h;$ #1U.;?.#"&546325#"&5/332654&#"&54>32#5!p +="6(KE#3M.83XYBLF57 + 8&Kc-(3ov*9#7 /I'69:V\IFa!#'" '}];c33E.J"&54632!5!##54&#"3".5463&'#"732654& +0& )1"@B \H2} #(/  ].  ,!.,  !1 7%f*336!U )+ #<*D%8o.>4&#"3"&54632!5!##&54>32#"&5/332654&#"6Q"  *5&82C3 + 8&KceT83XYBLF57[@ (&0733t'" '}]\|V\IFa!GU.JN!25#"&5/332654&#"&54>32#4&#.#"##"&5463265!["#83XYBLF57 + 8&KcA2,'(#-9+ &*/6-$F133{@2533##&#"2?632'7674#"&547'#5!#6746:M-3BB3T`!F  # "-F)*8' !) /d-n\\xZ17FM3`7#  )" F( 6' NkWG LcdY233{4[.:27#'47#>7&&547'#5!##5./7##"'&  3f2t2d-n <3KN $ a0 1DEPLcdY233A>] (RMrWG-..?6?'&547'&547'#5!!>7)'!#2")3!#)2>32TZ,k(N!* oZ8`Pc,H#"E (37>7#5&'R,!EZ  2F?2TZ,k(   (")3 % J+0G//1,H   + (37>7'&#"#&'7 8!#2  2hn,k( ')-X")3#F"W!- *Q 02,H !6- (332632'."33 FG! 4F0If.A;s3@32632&=474754'#567  JQ,!!2! 4F0If.A;."33s%   >!)0+wD}*33'I6* '0 <54'#"&5463367&547'5#5!!>?6765qVN43O- (0" 0!&"%   3%#)J &"y?H8G`b?M2 4"75& 0#)#33"!.M%25#"&54632"2?&547'5#5!!>?67#5&#""5473265!'$2&'4##< 3%#)J &"y*38 2:;K -1&%# 8)#33"! 5;,<*7/.j.#"#".54732?6325#"&'332>54'#"&543367&547'5#5!!>?>?>767#B K55 .3!"&547.=47##5!##5&#"27d%  2- *y%"V$3 ./MQ3U0  80  #z0 $sH5= MK0G33Ap  ' -Y507"753##5&#""&546325./7&54632&#yR3=`#.>-TFGkMp^),*' yU-J1& DJ3^P% )3'#CcLGK)[F=8Y4&+#3"&475./7&54632&#"75!###632R!  *GkMp^),*' #yC3yU-J1&v 72[? (&88GK)[F=8 DJ3t:L654'!53&/&5473##"&54>?654&#"7#"&5432654&'*!F 47! ΰT$4>./U9(-a <- .:8&.MC%!%30%16D<)%4*P23sv5S. G4- *%.$/^.$1kFsM20 /7T3;OA8   '+3k33H^HtBq}I 5Pb?,\F!a".: 0%"(Ee.[.#"#".547326325#".'732654'#".'&";27#"&546325!5!!327#C  /E#.EF :2965FsM20 /7T3;OA8   '+!:~QL3',.%0 &;) *+Bq}I 5Pb?,\F!a".: 0%"(3k33H^-,^.,%"&=&#"&46325!5!!>54#"'62Q,'<6!(9(5< 35%*>.@&vR3L33q 6Y1&"!=Y/.I4'!5!##".'732654&#"&5467.#"&546323>$u>t,+$N71[@43d/&$5I4$)/% )* )-0=!& >33-&3_"142JYG c}@1(7% "&!5  !253..W%.#'67.'732654&#"&5467.#"&54>323>54'!5!##!  JP*!"*6a?(4\=&$7G4$)/% () ))&)H2 $z>y*>3!  >"(0# MdZ! O#A0(7% "&"4  !2% ,,>33-&2 >5S,.L"&5467.#"&54>323>54'!5!##5&#"#"&5473>3254`C$=(+ ))&)H2 $k>j32: O 9J,8'#<(AH %"$P !2% ,,>33-&0'3*V02: >(11I).i#5.#"#"&54732?6325#".'732654&#"&5467.#"&54>323>54'!5!#"* >3C   LZ.EG  55)33-&2a).F%#&/532654#"'63. #"&54>323>54'!5!# %@(}"w66 `SaG1    ))&)H2 $k>j( +#A#m3<)H]     !2% ,,>33-&= 9y.$&547'5&#"&46325!5!!67d.<6!(9(5<e,.Lcb[23vR3L33!PUYy.5;"#5&#"&46325!5!!632#7. /6754&5'g3<6!(9(5<MN12 -cRTM>}*vR3L33o   +R#E :&.A3".547;26;2&547'5&#"&46325!5!!67&'#"# &/!24 i , d.<6!(9(5<e,./'5P@*81!3:b[23vR3L33!PUY .06#5&/67.#""&546325!5!#632&5455(3=e&=q9"4D$7?".W46#2D&2N;b!35:%&4)0")55*z33f;8lWq>;&!K.6<E.#'67&/67.#""&546325!5!#632&547#5'O+!?J3G&=q9"4D$7?".W46#2 5(3~D&22' J#'0?*635:%&4)0")55*z33f;8lWq>7&!    Y.HN&#"#"&547326325&/67.#""&546325!5!#632&547#=Y22#;]* ?A * '6=e&=q9"3C$"1?".We9 2 5(32LD&1<DL$3 8=* +b!35:%&4)5)55*z33f;8lSu>7eޱ6&p.1.#"&546325.#"&54>325!5!##W +>"5(LD$.J7"5- "!4#4,d1P3G*8#6/J'60C.9'& , '$E/F"e33uov.3:4&+#3"&475.#"&54>325!5!###632R!  *"4'"!4#4,b3C3v 72[? (&8.:& , '&D/F"f33t97.7D%4>3&'".#"&546323>54'!5!##54/&#""&#6'$;E )-07+' $C3)" '*ڏ.' ,, !25#>33o)((U0#,;  ..7"#"'727&#"+"&5463267.'5#5!##.'6325J $": <+,6"K (&0&T1IX`$J01O#,ESEU3:x "&'o)*&"33)<{0!B3'GR#"=74754&''65&#"'>3253>74#"&5473723!>54#"'6267&#"29d4T3 $% .# o5F[5E!*39 9f+<-/@)9 D $E9Z Y"&!? $1P 5 <0)  w 3 J&"!<4+E/" ,K~=I#"&/732654&#"&5475&''654&#"'>32533#2767&#"!0yAJ5$3 E:=)5I1,3e #K;\P0(+8"?=>;J^{XVF* A0!C &%NR  ( $!J_P3 & /y 5?727&#"63%&'4&#"'67654&#"'632533##5&''27&#"6)'kA+E!&/03W!) L&)PwZW5OQ1-&m9)4;Bt2H% *)E '4 ~K3.'`9G os*5:4&#"3"&5474&''654&#"'>32533##267&#"2#R!  *(2$%.# n6F3B42 # S34 ?R82j[? (&# W"&!$ $1PE3tI ,+R)!e7  s0>>32533##5&#".5463254/.''654&#"72767&#&#" n6F3VV3=_%%,>,OK $%.% # 3#2$ ?1PE3O *0($Cd. "&!$ 9 ,+2&(!  sFT7463263254/.''654&#"'>32533##4'5&#.#"""""&2767&#&#"YC/5% ( $%.# n6F3VV2,'(#-< # 3#2$ ?!$F1. "&!$ $1PE3 = &*/6 ,+2&(!.1;D>3267.'5#5!##.#"#"&'7267&/'654&#"72767&"76325Z.jZLUJ05 (2%$( ,%#' ")V[ X(E{)+&"33 EIe '$*& 5!+`E!#W23!52732#"'73254&#32654#"'632#"&=./67&'#5!654'"5473;{"="w/. ,2%=0')*G *n71l*<&I8Anf-% =,3(* #(69vK Zr8 #1? 8- -407X>0A_ %M#6@33*8&1,'aNaP'% .I'675!5!!327&5467+".527#"&'&'332654'#"/.', 26S _%+19/"#  -@%s$ 20:+.-7'%& .J-* 33., /hx+e s(4  31SZPEl."2("2.'5675#5!!67&54?67'&'Q\[p@f,. 4W59'}h<%2;33!4aQNI Qi "Z7I9&Z0.8>74732632&54?67'&/675#5!!67&#"#"&5S2)0x!0  4W59'}!@f,.)9q%>J\[ ,A,9B "Z7I9&Z082;33!4aQNI -[<%=.+2%&546?#5&/67./675!5!#636750_I-);"Y1Ky0%*"(T` $-E^w72+[uo);T&? *e#+33+W#T`l L d.+.+'675!5!##5&#".5462*H''%9!~A3=_%&+=ZH%$X,X.6b++33iP*1($B21.7=%#"&'332>54'#"&547.+"'675!5!##36?6'55oXN44O- (0" 0!&"9p(\g%,  S]D46326325.+'675!5!##4&#.#"""##"J(3' *9!~A2- 1%$.H''%0,.6b++33<)  +60$X,hA.SW%6325#".'32654'#"&54632&#"3267#4&#.#"""&546325!' (9bC:"9%T,P"5R3O)4! K%3!%(#2,'(".;B05XE1Jm_:Q?3Z7?#00):2G #!9 &R:* &*/7,$F33. P4'#32'4'#5!##".'732654&#"&5467.#";27##"&5467# 6: &f %#hQ1[A43'=[06H-#1)0! +%!4,("&T!-33543VD\1JXI V^A@1!>!&. #3+'8O[33##5./67654&#"32727+"'#".#";27""#"&546754'#5!6324'#32\%jI4QQ4";,C&,n'B7) ? D#G7 *& e)7?Q# '*:8P)YX3I% 58<"*$3J))3+'!-3JI4,#).1=&547'5#".#";27""#"&546754'#5!!674'#32nd.#G7 *& ee,.# '*:Lcb[2[))3+'!-33!Q~UY4,#).2>#5'.#"&546325"&#";7"&546754'#5!#4'#3224L"3 #QA"+c   && oM4#(&:B E1?7 /G%:B|X,#'4335*5* #, .-47254&#"#"&547.'5#5!##5&#""&5465.H$`#B2U)D>NB93=_%#.E-=79.!21C+P,],&!"33P *3(+;82Nbs Z2767&#&#"4'#32'4'#5!>32533##4/.''654.#"#".#";27""#"&54670)3#2$ >`# '*: e N$F3VV3 $%!/,#G7 *& (82&(84,#)T!-33 'E3:. "%" "9))3+'bs^kw.#"#"&54732?6324/.''654.#"#".#";27""#"&546754'#5!>32533##2767&#&#"4'#32C  LZ.EF 46 $%!/,#G7 *& e N$F3VV30)3#2$ >`# '*:2(M@%0 .<)+). "%" "9))3+'!-33 'E3(82&(84,#)`shv%263254/.''654.#"#".#";27""#"&546754'#5!>32533##4'5.#.#"""""&5462767&#&#"4'#32 2) ($%!/,#G7 *& e L#F3UU2- .$#.;DM % 3#1% !?\# '*:1. "' "9))3+'!-33&E3 % -3/7,%E--+2&(!54,#). J4'#32%467&'#5!!32732#"'73254&##5./7.#";"&5/ ;*d Z< ^r#%/"(M83'5!ll *" #33 O6GM^O7-&-=ZC;V -VK ,.Zg.#"#"&54732?6325./7.#";"&5467&'#5!!32732#"'73254&##4'#232F6LZ-EG  38'5!ln **d Z< ^r#%/"(M83V *';2(M@%0 .<)+2;V -VK , #33 O6GM^O7-&-=A'.NZ#"&'332>54'#"&547.#";27""#"&546754'#5!##"'36?6'4'#325pWN43O-'9 0!4*0" *& ea1$ # '*:NF9FbbAL2,$ 7$'/ #3+'!-3309-/ " \4,#).T`%25#"&54632"32?#".#";27""#"&546754'#5!##5&#""5473264'#32!'#7")2# F#G7 *& ea/3: 2 0DR# '*:Y -2%&# A))3+'!-330985;442B4,#)Z.kw&#"#"&547326325#"&'332>54'#"&547.#";27""#"&54674'#5!##"'3>7#4'#32\7<QLZ.FG 929/=N43O-'9    4*0" *& ea1$ !.5(3# '*:q: M@+* +9, +nbAL2,$   $'/ #3+'(-3309-/ 5F9;-A4,#).3?J%463&'#".#";27""#"&54674'#5!##54&#""&74'#327#A5&,#G7 *& eC3Y/ '*# '*:2D(&#))3+'(-33o] ()4,#)09 .>8op.4;%#53##54&#"3"&546754&#"#"&547.'5#5!#!530*C3Q"  *`#B2U)D>NB =79.5533t6@ (&/{C+P,],&!"3382N.JV%25#".#";27""#"&546754'#5!##54&#".#"""&54632674'#32 #G7 *& ea 3 *-#+& .9A).3l# '*:))3+'!-3309*$(  @-7,$G7 4,#)\.;B%254&#"#"&547.'5#5!##4&#.#"##"&5463265;`#B2U)D>NB92- .#%.;K'2( =79.C+P,],&!"337- ,4",07-,=082N(.>JS4'#5!##5.#"#"'73267.'#".#";27""#"&546?#325476325n e?53 :.10A,. 0;1$#G7 *& ˵ '*:D@5"'2!-33N+(Tj# F?9!-/))3+'U#)B4,74Eh(.Yen.#"#"&54732?632.#"#"'73267.'#".#";27""#"&546754'#5!###325476325A 6K\-EG 38 :.10A,. 0;1$#G7 *& e?53y '*:D@5"'2c'LA(- ,;)+N+(Tj# F?9!-/))3+'!-33m#)B4,74E[.;C3&54632635!5!#'654.'#5.+'67.#"&#"I!SK'; !u7J 4 :1-'X= !C" +@%"h8-i,L,=!  a33 (3"6!)& ) )K:0O;"_` ;.L46326325!5!##54&#"632'67&#""&5463254&#&#";"&=29- !"s3ZB!AH"+ '%A & 'bEAH"1@#!  %,a1G5&L33œ+\;+$'  %$1&!=QL  ^1,17,W3723!32654#"'632#"&=4/.#"&#"&546326325!5!>54#"&5473C =f*2N$, ,<!8QI(8#%"y{[5E!* z 3 H&"!8#Y:, . ^ ++N,=1&3h3 8 <0 (  U,u.#"#".54732?6325#"&=4/.#"&#"&546326325!5!>54#"&5473723!32654#"'632#@!L'F:.EG 8356$, ,<!8QI(8#%"y{[5E!*3C =f*233v& D4%0 ,<)*2:, . ^ ++N,=1&3h3 8 <0 (   z 3 H&"!8#LT6.B&54>326325!5!#>7#"&'332>54'#"5&#".#">$$3 4"(/& +"OzCRs9>-<)&:M8&)+#$G( " C #*/)$Y33 :<[rSk$&-#3,$*@i>?$7Y.b.#"#"&54732?6325#"&'332>54'#"5&#".#"&54>326325!5!#>7#@!6K\.9S29+,Rs9>-<)&:M8&)+#$$$3 4"(/& +"O33r&LA%0 *32+Sk$&-#3,$*@i>?$7( " C #*/)%Z33 :<[PF8.P32654&#"&5463254&#".#"3254'7#"&546326325!5!##".'NM8F40)H5 /+3''=. 1-=C0; .d?gQ326325!5!!67ge.&)+#$$$3 4"(/& e,.R]b[2|>?$7( " C #*/)%Z33!P`N.HM25!5!#632&=656=4'#5./75.#"'.#"&54>326: : ."332>7&#"3d/+3''=. 1-=C0; .d?3# Z#' # 3'C@"(D!/&9-%C 1 F33a ' $)E]  ,.Q&'.#"""""&54632632&/#5!!3273#"'73254&##5./67d--*"(:-(69vK ;P$ 5 K:/,: %kB-/6-,=0#%33*8&1,'aN %51 &$ 1 #2>ZFFX %.n.#"#"&54732?6325./6?&'.#"""""&54632632&/#5!!3273#"'73254&##E  LZ.EF46,: %@--*"(:-(69xM ;P$ 5 L:32(M@%0 ,<)+5FX %3B-/6-,=0#%33*8&1,'aN %52&$ 1 #2>o.I%2#53##54&#"3".54754&#"4&#;27#"&46326325!5!#84B3Q#    '@'." 0&;GG;1.+&S )5733t6? (!Y&&3))90QR0+ 33.I%25&#".#"&54>326325!5!##5&5&#".#"##"&546326*&)+#$$$3 4"(/& O3 */",%/8C(.3>?$7( " C #*/)%Z33W) B.9+$F7!.?H%"'.'27#".'#"'72654&#'326325!!'2654/&'\ %# % 8- '/ #!7l/"C  Y{+51-S%G34 0 +#,1 &30/IK[3=#$ 0]3* G.[f4.'#"=&'327#"&'#"'7254&+'632>325!!32632.+732>'2654+"'` _0N)&%  - ):(  W&2     &N.?b>g6Q"9mCP6D3*AYwKG% +11 &' ,A* N3< M81^(/K$Aw2<J(!-]32654&#"&5463254&#"327#"'#"#".'7&'7;>54&#"56;263533#Q&54&#"56;263533##5&#".546324&#"327#" 4#I5N3QQ3=_%&+>,.H$P%!, <X')-1=8k_  $W3P *3&$B21s/6 +oS%4&#"327#"'#"'7;>54&#"56;263533#2#53##54&#"3".546P%!, <" 4#I5N3&&54B3Q#    )5r/6 +:')-1=8k_  $W3:733t6? (!"\726324&#"327#"'#"'7;>54&#"56;263533##4'5&#.#"""&5461) (P%!, <" 4#I5N3QQ2- .$# .;C1s/6 +:')-1=8k_  $W3 > ,4/7,$F.8@327'654.'"47#5!#'2654&+"#5.+'767&x1b1a4JPc])/$  2'[A!)7\$ E%Y( MK$33+## P:Q(#;GN70$0#)#g.JT]"&547#".547#5!!>32'654#"#5&#"#".473263254'326?'654.'"1G$ $4 '' !0#"1230< S'-()T 0, ! a1WI # ,K$33+9) 8-##B2* 218#9+01S1':K -A*3F31B 6 5 +o< .'Fm'<@67'&/&'#5!654'"&5473723!32654#"'632#"&'.'7#')=[3G"*`4B0;c %!".:c4.r=Ũ4tG5/  3 1 ?/). D836C$"1'6vS %6Vgh'$U]f.#"#"&547326325#"&547"&547#5!4#"#"&547326323#32654'7#4&#"6'327CPLZ.DG<46JN*3^B<:NWJ0 zSE5g~M[M8,u#=3!N! !0"c' M@*+ ,;) ++3&:K37@+3F31<  4=:35'N6H"#9+/M +o< .'jm'[_.#"#"&547326325#"&'./67'&/&'#5!654'"&5473723!32654#"'632##B   L[.EF 046*+.r=!)=[3G"*`4B0;c %!".(!32va'LA(- 1 <) + %6V.5/  3 1 ?/). D836C$"1'+b'iT1;G654'#4>7'&5467'#5!&5473##"&7&/62654'  D%,;\P6&+   )>0cGEW;9)<&7F<&:3|1 )&N?3]G#x@TV6\8!q.$:AE%"&'#5./67&'#5!!>32'4&#"'67654&#"32%&'5(.g3AcG*g-~"# ,<+.1'-P$ D20f".H;0{UT]O$@\H:%R#A33%  >-5%13gh3. ( FDKG(>+7qc#ws IN2767&#&#"327'654.'"47#5!632533##4/.''654&#"#".%67#c # 3#2$ ?1b1a4F3VV3 $%-V) $" ,+2&(!B%Y( MK$3 E3:. "&!$ (5 ,y #sGT\ej.#"#"&54732?6324/.''654.#"'#".547#5!632533##2767&#&#"327'654.'"767#F7LZ.EG  38$%-X* $4F3UU30)3#1% ?1b1 '2(M@!4 .<)+). "'  )7 ,K$3E3(82&(E%Y(  .D27'74&#"26"&547#5!!632#"'732654##5&/67'x*\' )> :Ahq)diG4Ke$!  3>(a8^Nl>.=&7533#&(4#>">>E:%0 ;PnAW6=&.KS^.#"#"&547326325&/67'#"&547#5!!632#"'732654&#"#27'74&#"26wCNLZ.EG 8 46=(a8?:Ahq)dgH6Ke$!   2( M@!4 .<) +*V6=&=&7533#&(4#> @>E:%0 ;#/Nl>.:.4A327'654.'"47#5!##54&#""&5463&'#".7#x1b1a4lC3]+ '*5&3: $/%Y( MK$33oZ()!((- ,-<  3+#oR.)04%#53##54&#"3"&54675./67&'#5!#&'5y12C3Q"  *BdE*g-~"!3I;0|UL4433t6@ (&# ]G:%R#A33(?+7qc{}.I3254'"'3'2654&+"#5.+'767&'#"&'6?32654'4'#5!hVG?8&h8$=9)IY]&7  2'[A!)CO?"<8  $?E",l$H8$"5 N7P(&4GM80$:Q3  @*33.T^%&5467&'#"&'6732654'#5!#>32'654&#"#5&#"#".5473263254#"'3254'"'$1#."<8  ))!0#"231;V%7 (+2R 1,%C8$= # !H?3!3.33"5/ 8-#B2* #3*)A"8; /I$H8$v}.RXb.#"#".547326325.+'767&'#"&'6?32654'4'#5!#'2654&+"#3254'"'h:B/.) >>2,2'ZA!)CO?"<8  $)IY]&7  3VG?8&h8$=T' ;(*+ *;) +EN70$:Q3  @*33"5 N7P(&4IE",l$H8$S L254'#233##5./2654'#"&5473274'"&'#"'7327#5!2'!]  z*?>X3ll1:@g,Hd=A-*-  K10 <"1% $ ?2)>'   ,$C=W3&/?')I0&J 3/6::!)n3EdI'KS%2654#"'632#"&'5.#"#"'73267.'5#5!467474#"&5473723!25!6?a*/6a6 +4-!21@,%. B_2[8E!*a3DC '1`$RK&"!<9Z!-?4?4jOCK7%3 4 <1)  / C73n=EoIC$Y4&+3223#32654'7#"&54>7.'#"&'6732654'#5!4#"#"&547326%V9#=CE5g~3HH38+v#7.'#"&'6732654'#5!4#"#"&547326323#32654'7#4&+32EM/E#-EG 8 38@<*3 )/';"<8  #:NVK0 zSE5g~3HH38+v#=33 $V9#>c' ,.(- ,;) +3&!#=*3!A) 3F31B  4=:3#B419#9+/&%M+$H9*.>G#".'732654&#"&5467&'#"&'67326=.5#5!!3254&#&#"dT7&'#"&'6732654'4'#5!##3254&# JO+!%6b?(3-5N*5I41* +"2"<8  #7W&$"43f9#=B  >!)0NdZ ;PA.@1(7!& #,F3!A)33"#2 UK+$H8 ).JT"&5467&'#"&'6?32654'4'#5!##5&#"#".5473>3254'3254'"'`C$;'6"<8  $7W$30< O $7 ,5*#<(8$=EH%"#OH3  @*33"1 53*!/) 2:;&31$H8$h(.bk.#"#".54732?6325#".'732654&#"&5467&'#"&'67326=.5#5!##3254&#uD6/E#-EG (38)1[?43\>&%5I3$)2(5"<8  $7W% #">3[9#=c',.(- ,;)+b 2HZG S"@1(7%! E3 @* 33"!4 UO.$H8 *q&.7A%#&/532>54#"'67&'#"&'6732654'#5!#'3254'"'#J1|"v54!$0>!`G1z/"<8 #7W.&?8$=+3#B#m3,"I] |?3!E# 33"%7#$H8$. ?2654'#%3267#5!##5.#"&546325.'&'+"/P ' 4A-5 , /.;6325.'5#5!##5&#""&546325.#"#"'7326s@5"'2 B_853=_%#.>,-H% :(20A,-84EK7"33O *1)#C21N4?4j" Es Y2767&#&#"'3254'"'3#67632533##4/.''654.#"'#".'#"&'6?32654'4'#5!0)3#2$ >8$=`' B!F3VV3 $%-44 "<8  $7(82&(($H8$)E3:. "'  )(3  @*3sZgqv.#"#"&54732?6324/.''654.#"'#".'#"&'6?32654'4'#5!632533##2767&#&#"'3254'"'3#6E  LZ.EF 46 $%-44 "<8  $7!F3VV30)3#2$ >8$=`' 2(M@%0 .<)+). "'  )(3  @*3E3(82&(($H8$scq{%63254&/&''654&#"'#".'#"&'6?32654'4'#5!632533##4'5.#.#"""&546322767&#&#"'3254'"'3#6 ( %&14 "<8  $7H3UU2-1$# -3&'#".'#"&'6?32654'4'#".  8$=YC4\+ ' )(% / 4 "<8  $".0< 3$H8$33oZ (+" /!(3  @*o.C6325#53##54&#"3".54675.#"#"'73267.'5#5!#s@5"'2313/B3Q#     :(20A,- B_8!84E:433t6? (!, N4?4j" EK7"33.LV726325.'#"&'6?32654'4'#5!##54&#".#"""##"&5463254'"'10!2 "<8  $7W33** $.9B8$=6 '3  @*33"<(  %*(-7,$F$H8$.N6325.'5#5!##4&#.#"""##"&546326325.#"#"'7326s@5"'2 B_852- 1#!-.#""&546325&/32>54&#"&54632&'#5!K '7!&"/>,-H%z_:&: M$B0d/6lY&&3|"8 *2)#C21Tc09!(# $<#$*9+KZ9o2[p!*33I..22'654&#"&/32654&#"&546326%5!0:.;&A|Z&[,CXK&1++ Q?0a 5'v;1$:*.#a!Yr!G9!@3$=4 %4EF*-V33./=B4'#5!#2?&547#5.#&'>354&#"/46725'.5#7#3f%X9 0D3O+$1J5-+B?YG+DR1!#33]*/On=|6E!+;( h9 ;M52*=.O;27#"&'&/32>54&#"&546326326325!5!##4&#"4&#|/'-@ %CY&_:&: M$B0d/'V":0/+&+VN3@'." %*801+"[p!H9!(# $<#$*9+K4''0+ 33Y&&3)J.FJ%25&/32>54&#"&54632&'#4&#.#"##"&5463265!"z_:&: M$B0d/6lY&&2-+"#! .;J(2( Oc09!(# $<#$*9+KZ9o2[p!*7-  B"07,+?033W~P[g2533##&#"32?632'#".'32654&'#"&=#5!#26754>4632#"654#"+1;K-2AB3S^*= # ,&D(#p[=b7'/Z4(-CP4 %  Y&7, "b,!/0HP3 `:  7(>'WjIe[&$[H4 7!5+33" b (< 2i^ 7hT.,39.#'67.+"'675!5!##"'72>54&+#/P+!AU(w2zw9F0/")( \23)L Kf!*0D,4U6`*.33.(L1#B%'7L2JX/W)  +{1.#'675&#"32632'7674#"#"&54632533##yQ,!LeV^!F O",E**8+ N  WC9M.3CC3 *0L2o7#)"!E( 6)%1^5HM3N.,5.#'67./7##"&547#5!##27#OQ,!ES"q=N&HO=3& !&')3  J *0E-0B (R8,33SE $ #a0    U.#,%.#'7&'#5!!#'2>54.'$  JP,! c=2-* 33#bDLgC   >!)033=&(4GYi .EP&'#5.#'67&+532654./#"&=#5!!;26722654'#"'\# J3%80?R/."3O+!B]}GVx _104*= "12 NC1      <(3/)$3#'0F/U4[2@].33 @ZK&7a.M.#'67&547#".'32?#"&'&5332654'#".547#5!!32?#Q,!DY #0C( $*%*`4H3m9"@(1'2KzK9# 3!)0F../]X ! B!-"$,!@Rx+F! c6'$&1/a1337'!>_;HTZ'@7523!32654#"'632#5./7.5#5!654'"&5473G$B>.I/;d&!"-33  !&d[[3G!*a!#/%l32533##dQ,!MdY$-H, )F>)3& 3__3 *0L2c+w4<>3^+1:('c3.U.48%.#'67&'&/332654&#"&54>32#5!`JQ,!-313XYBLF57 + 8&Kc503v  >!)0." V\IFa!#'" '}]Ai33[3833##5.#'67./67654&#"32727+"&54624\%jI4QQ4P,  (V~Q2JL8P)YX3`3 *0@*=@ 8<"*$3- 2DJe&.&,"##5!!632#7. /6754&5'g3HLP12  .cRUK>}* 33p   +R#E 9&-5 .5:5%"75!##5.'#5./7&54632&7675#0{&]#yg3C3GkMp^),*' yU-J1&3gw: O4  2 DJ3X/{ VGK)[F=8Y323>D'@s$k>j3  !$z 94 ))&)H2 #/">33-&5"*!L, !2% ,,.$,767.#"&54>325!5!##5.#7JfA&'"!4#4,b3P3Q,# KEN0?C , '&D/F"f333 *q    s%3.#'6754/.''654&#"'>32533##2767&#&#"P*!Md $%.# n6F3VV3 # 3#2$ ?"(0N0F. "&!$ $1PE3 ,+2&(!. ).5.+'675!5!##5.'#675s.{%]U9!~f4D3H''%3on: M6  1.6b++33X/z $X,JL+YA.=A%4632&#"3267#5.#'67.'32654'#"&'5!  J)4! K%3!%(#2M,!'*:_B*9%T,P"5R3OXG   #00:2G #!9 &R3!)0) LukDQ?3Z733.<7574'#32%#5!##5./67.#"327#"&54674G$Ex# '*:ea3  !'l$c +& #/&4,#)3309;"*#CG3*'(c .BGR.#".547326325./67.#";27"#"&54674'#5!##574'#32^;V%B6+@D7.4  !:Y$c  ,+ "a33kH#H{#  V:g' D5'/ /:, +1!*/7G3*#(-3309B.T"0)4, K 9h.',5.#'6754&#".547.'5#5!##'5x=79.S+!Jg`#B2U=4>NB93hO/82N +0L1C+P,L/&!"33m+}. J%55>754&#".547.'5#5!##5.#"#".54732?6325.#O/=79.0O2`#B2TB. ALG83B!6/E#-DH (47R,+}73N27 C+O,G1$$"335',.%0 .<)*+, .6.#'6754&#"4&#;27#"&46326325!5!##Q+!Md@'." 0&;GG;1.+&S.N35 *0O/QY&&3))90QR0+ 33;76754&#"327#"'#"'732654&#"5263533##5.#IhP%!, <" 4#I5N3QQ3Q,EM1s/6 +:')01=8i_  $W33 *&.*2757#5./67&'#"&'673265#5!!3254'D'@33  !(kK$"<8 " 78$=#/#"<"*$B]3!'O/33$H8".&/7675.#"#"'73267.'5#5!##5.#6325Ih :(20A,- B_853Q,@5"'2EM12N4?4j" EK7"333 *84E. 75%5!##5.#&/32>54&#"&54632675.{%]Hf4H"^Y&_:&: M$B0d/3gnq: M6 133X66 [p!H9!(# $<#$*9+KQ5L+'.26%.#'67&/32>54&#"&54632&'#5!KJR+!EZu_:&: M$B0d/6lY&&3  >!)0F/X,9!(# $<#$*9+KZ9o2[p!*33_#".'#5.#"#"&547326325./>54'"&547326733#3274#"3"54632K+( 4CQLZ.EG 7 4686q4)$1( ,(54'"&547326733#67O/_4CQLZ.EG 7 4686q4)$1( ,(?>54#"&546#0%s/O;5SKI/ &@b8M 6$,E-/()"9$ &[OYY6#80B:[o ;$YkGO *"%Q[%`;+1># 3 .F{`"&'#5.#"#"&54732?632&#"32632'7674#"#"&54632533#3274#"3"54632KT)3CYM.DG28V^!F O",E**8+ N  WC9M.3  6 *>0#$,96G##6'W6), *;)*<7#)"!E( 6)%1^5HM3G,X'$;(<{{W%&=47#5.#"#"&54732?632&#"32632'7674#"#"&54632533#67=/^3CYM.DG28V^!F O",E**8+ N  WC9M.3@7CB _! 6'W6), *;)*<7#)"!E( 6)%1^5HM3#`%+{j"&'#4'5.#.#"""&54632632&#"32632'7674#"#"&54632533#3274#"3"54632KT)2- .$# .;C/1) (V^!F O",E**8+ N  WC9M.3  6 *>0#$,96G##   ,4/7,$F17#)"!E( 6)%1^5HM3G,X'$;(<+{{a%&=47#4'5.#.#"""&54632632&#"32632'7674#"#"&54632533#67=/^2- .$# .;C/1) (V^!F O",E**8+ N  WC9M.3@7CB _!    ,4/7,$F17#)"!E( 6)%1^5HM3#`%.|.#"#"&=7332632'&547#".'32?#"&'&5332654'#".547#5!!32?3274#"3"54632#".'A t"?O2)/!y '$#0C( $*%*`4H3m9"@(1'2K(K9#  )7 *>0#$,A4   --4XA ,F4 2H']X ! B!-"$,!@Rx+F! c6'$&1/a1337'!#3X'$;(<-,Q ,M6A.q.#"#"&=7332632'&547#".'32?#"&'&5332654'#".547#5!!32?67&/&=47A t"?O2)/!y '$#0C( $*%*`4H3m9"@(1'2KLK9#  ,8/ ]--4XA ,F4 2H']X ! B!-"$,!@Rx+F! c6'$&1/a1337'! #`% 1T .KE/! K5A.IM#"/#4#"#"&547372&#"327#"&546323274#"3"546327!5!L*: .\ =K, V'&w !)7.  5* >0#$,#97F/r]I4<*3$#m'$#*8. ) 4X'$;(93.<@%&/&=47#4#"#"&547372&#"327#"&5463267!5!b/ ^.\ =K, V'&w !)7. @7?D>G .KE/! r]I4<*3$#m'$#*8. :L3h#"/#5.#"#"&54732?6325'./67654&#"32727+"&546233#3274#"3"54632K+9 4CLZ.EG (46A1]A,p'@7) ? (V~Q]$iJ4 )6 *  >0#%,94I/5(M@*+ .;)+BF11 8;"*$3- 2DJ=7Q(ZX3 3X'$;(<{[%&=47#5.#"#"&54732?6325'./67654&#"32727+"&546233#67=/^4CLZ.EG (46A1]A,p'@7) ? (V~Q]$iJ4@7CB _! g5(M@*+ .;)+BF11 8;"*$3- 2DJ=7Q(ZX3#`%.B%&#"3262&'#"&4632654#"#".5467#5!!32>F$ $%3@-   (0M9<("/24:3;-,9 !+0&0\LD4WE BA9908?JV!?-:#&K22O&7(/(.T#"./4&5&'#"+".547;26;2&547'#5!!673274#"3"54632A4)  .(5 P '0!1-$ i#* d.e,  6 *>0#%+9,Q1C^P @*/:!3:jS2"33!F+X'$;(<.E%&=47&'#"+".547;26;2&547'#5!!6767S/[ .(5 P '0!1-$ i#* d.%e, +8CB b! 1C^P @*/:!3:gV2"33! #`%5W%"&547326325./7&54632&#"75!#3274#"3"54632"&'#5.#"yyUDUF`.EF 3 :FkMq_<+( $y$  6 *>0#$,KT)3D = $#& $k>j ,-)=52$.6&6 o& )6')H2 >33,'2 (!4/&QE'+H,' " Q !2!+,,.=74632'.#"&54>323>54'!5!#&#"327'#"&;,  :1 ))&)H2 $k>j(#%" 'o"*E(39- !2% ,,>33-&> S'(.+4'!5!#'7".#"&54>323>$k>jd3b:D  ))&)H2 >33-&1,G (J8g,, !2% ,,.G7467&#"&54>323>54'!5!##"73254'#5>54&#"3&80?' ))&)H2 $k>j!D"4ZIj0(Wp2 89,O*51]$? . !2% ,,>33-&($0426BGC) 1(%'4 Q.c#"./&'&'#"+".547;26;2&547'5&#"&46325!5!!673274#"3"5462$K*)  /'5P &/!24 i , d.<6!(9(5<fe, -7 *>0F-96G5AUY @*81!3:b[23vR3L33! 3X'$;(: .T%&=47'&'#"+".547;26;2&547'5&#"&46325!5!!6767/\ /*2 P(. 24l$) d.<6!(9(5<!%e, +8K: d! 4@UY @*81!3:b[23vR3L33!  sXf#"&'#5.#"#"&54732?6324/.''654&#"'>32533#3274#"3"54632%2767&#&#"A4*)3C  LZ.EG 46 $%.# n6F3 )7 * >0#$, # 3#2$ ?9,Q##5(M@!4 -<)+). "&!$ $1PE33X'$;);Q ,+2&(! }sM[%&=47#5.#"#"&54732?6324/.''654&#"'>32533#672767&#&#"?/W3C  LZ.EG 46 $%.# n6F3C- # 3#2$ ?CB _! o5(M@!4 -<)+). "&!$ $1PE3#`%# ,+2&(! scq#"&'#4'5&#.#"""""&5463263254/.''654&#"'>32533#3274#"3"54632%2767&#&#"A4*)2,'(#-0#$, # 3#2$ ?9,Q## = &*/6-$F1. "&!$ $1PE33X'$;);Q ,+2&(! sXf%&=47#4'5&#.#"""""&5463263254/.''654&#"'>32533#672767&#&#"D/\2,'(#-0#$,A4))4#:/ #*.) H''2" H,6`-+333X'$;(;.,Q"!5 ;'+* (&3{$`!k.?H726325.+1'675!5!#67&=47#5.##".547  8"zqA1/Y4#:/ #*.) H''2" H,6`-+33 #`% 1T d! p5 ;'+* (&3{$`!N.Q5#"&'#4&#.#"#"&46326325.#'675!5!#3274#"3"54632g~E0oA4*)2- 1%$ .;J(3' *9!~g  !6 *>0#$,:$e8,Q##<)  +607X>0,.6b++33G-X'$;(<+.GP%&=47#4&#.#"""##"&46326325.+'675!5!#67/]2- 1%$.;J(3' *9!~D"TH''%1T d! <)  +607X>0,.6b++33 #`%$X,.RV#"/#.#"##".547;725#"&54632&#"32?3274#"3"54632%5!A49- -!  9;$1C1*m7aD0;3% 9/:81 )6 *  >0#%+79,Q/#"J5214B "U>0!+$+ 38883X'$;(:33.EI%&=47#.#"##".547;725#"&54632&#"32?675!n/^- -!  9;$1C1*m7aD0;3% 9/:81A6zň1T d! #"J5214B "U>0!+$+ 388E-Y"f33=.PW#"&'#5.#"#"&5473263254&#"#"&547.'5#5!#3274#"3"54632%5L)(*3C YM.EF :56`#/*U)D AML  !6 *>0#$, ?59.97F##;5(W6+* *;) +5+P,],%""33G-X'$;(<73N={.FM%&=47#5.#"#"&5473263254&#"#"&547.'5#5!#675=/[3C YM.EF :56`#/*U)D AML?5T?59.CB _! 5(W6+* *;) +5+P,],%""33#`%f73Nsx"&'#5.#"#"&54732?6324/.''654&#"#".#";27""#"&546754'#5!>32533#3274#"3"54632%2767&#&#"4'#32KT)3E)LZ.EF46 $%!/,#G7 *& eM#F3  -7 *>0#$,3#2$ ?[# '*:96G##5(M@%0 ,<)+). "' $":))3+'!-33 %E3 3X'$;(9O)!2&( 64,#)sl{%&=47#5.#"#"&547326324/.''654&#"#".#";27""#"&546754'#5!>32533#672767&#&#"4'#32/W3F6YM-DH :38 $% /,#G7 *& eK#F3E+3#1% !?Z# '*:1T d! o5)W6%0 ,<) +) * "' $":))3+'!-33 %E3#)!2&(!54,#)O..4@#"&'#5.+"'675!5!#3274#"3"5463254632#"&6A4*)3>$h )7 *>0#$,09twF&9,Q##Y/4^6&333X'$;(<- \'"'.#)5%&=47#5.+"'675!5!#67%54632#"&/X3>$@B/~9twF&CB _! Y/4^6&33#`% \'"y.%#".'732654'#"'732>54&'.#"632'>54##"&54632754&#".#"3254'7#"&546326325!5!# P+@uL.3Sz7%  #;%!, 4B  H"%!/+3''=. 1-=C0; .d?1d'  ):X}r% Ef$ - @I'D/   "C  "IDF(D!/&9-%C 1 F33DaJ[#"'732654+563632>76?67#"&'732654'#"'673264'.'32>7#"&(  `   M%%- )E$M9m%2Q!?"  '1"    1 G,A#=! ~"Y/Tj&/ *,d%P   ( + o#"&'#5.#"#"&547326324&#"327#"'#"'7;>54&#"56;263533#3274#"3"54632A4*)3E  YM.EF 2 56P%!, <" 4#I5N3  !6 *>0#$,9,Q##5)W6), .<) +Ms/6 +:')-1=8k_  $W3G-X'$;(<c%&=47#5.#"#"&547326324&#"327#"'#"'7;>54&#"56;263533#67J/V3E  YM.EF 2 56P%!, <" 4#I5N3C,>G ^! o5)W6), .<) +Ms/6 +:')-1=8k_  $W3x#"&'#4'5&#.#"""&546326324&#"327#"'#"'7;>54&#"56;263533#3274#"3"54632A4*)2- .$# .;C/1) (P%!, <" 4#I5N3  !6 *>0#$,9,Q## > ,4/7,$F1s/6 +:')-1=8k_  $W3G-X'$;(<n%&=47#4'5&#.#"""&546326324&#"327#"'#"'7;>54&#"56;263533#67R/]2- .$# .;C/1) (P%!, <" 4#I5N3A5CB _!  > ,4/7,$F1s/6 +:')-1=8k_  $W3#`%serz#".'#5.#"#"&54732?6324/.''654.#"'#".547#5!632533#3274#"3"54632%2767&#&#"327'654.'"767#K*) 3F7LZ.EG  38$%-X* $4F3  6 *>0#$,0)3#1% ?1b1 '96G5(M@!4 .<)+). "'  )7 ,K$3E3 1'X'$;(0)3#1% ?1b1 'CB b! r5(M@!4 .<)+). "'  )7 ,K$3E3#`%#(82&(E%Y(  . FP73267&#"&'#"&54632765'&5&'#"&'6?32654'4'#5!!3254'"'(# 8-$A71%-7'9X)"<6  $78$=  ""1 7);(&HM'-"$-' "! j3  @*33$H8$1.9C74632'.'#"&'6732654'#5!#&#"327'#"&3254'"':. #7"<8 #Zz%##" 'o:3#8$=&42.'3!E# 33" 4 X6G$H8$6.%/?&'#"&'6?32654'4'#5!#3254'"'͑Y)"<8  $7W)!d8$=j k3  @*33D6,G~8$H8$.MW#".'73254'#5>54&#"3&5467&'#"&'6?32654'4'#5!!3254'"'#."4ZI.PDM0)Wp278-F )2]17/"<8  $78$="/ ,527B%AYD) 1%'4NG >3  @*33$H8$\.Yb#"&'#5.#"#"&54732?632.#"#"'73267.'5#5!#3274#"3"54632%6325A4*)3C  LZ.EF29 :(20A,- B_8 )7 *>0#$,@5"'29,Q##Z6'M@*+ ';)* N4?4j" EK7"333X'$;(<84E\.NW%&=47#5.#"#"&54732?632.#"#"'73267.'5#5!#676325U/[3C  LZ.EF29 :(20A,- B_8c@5"'21T _! 36'M@*+ ';)* N4?4j" EK7"33#`%f84E;su"&'#5.#"#"&54732?6324/.''654.#"'#".'#"&'6?32654'4'#5!632533#3274#"3"54632%2767&#&#"'3254'"'3#6"KT)3E  LZ.EF 46 $%-44 "<8  $7!F3  6 *>0#$,0)3#2$ >8$=`' 96G##5(M@%0 .<)+). "'  )(3  @*3E3G,X'$;(8$=`' >G ^! p5(M@%0 .<)+). "'  )(3  @*3E3 (82&(($H8$6s#"/#4'5.#.#"""&5463263254&/&''654&#"'#".'#"&'6?32654'4'#5!632533#32>74#"3"54632%2767&#&#"'3254'"'3#6K*; 2-1$# -0#$, # 3#2$ !?8$=Z! 96G/ % +5/6-$F1'"),%(3  @*3 E3F,'#'$;(9O ,+2&(!+$H8$  sx%&/&=47#4'5.#.#"""&5463263254&/&''654&#"'#".'#"&'6?32654'4'#5!632533#672767&#&#"'3254'"'3#6/ W2-1$# -0#$,@5"'29,Q##:*  +6"06-+?0N4?4j" EK7"333X'$;(<84E.Zc%&/&=47#4&#.#"""##"&546326325.#"#"'73267.'5#5!#676325X/ ^2- 1#!-54''4&#"3&546327%5!w=3+!*W "h~G29S&+H$+#!&A[G6H&B225GDi&R $j|"F"!0&8%`'2-$02T5FKV!_33!.6:%47""./32>54&#"&54>32632'&5!  o\&D?[>&: L%/,#<(6k :+N@/L$Xs!U?!(# $=4!3 "*W6 39OW ,33N.,08#"&'#5.+'675!5!#3274#"3"54632%'5A4*)39!~g  !6 *>0#$,9V$ %9,Q##Y.6b++33G-X'$;(<7@>e X,&.!%-%&=47#5.+'675!5!#67''/X39!~?B/9V$ %>G _! Y.6b++33#`%@>e X,N.,4=#"&'#5.+'675!5!#3274#"3"54632.'75A4*)39!~g  !6 *>0#$,`:,n6H''%9,Q##Y.6b++33G-X'$;(<&Q . I7Q$X,)."*3%&=47#5.+'675!5!#67.'7/[39!~B?5`:,n6H''%CB _! Y.6b++33#`%o&Q . I7Q$X,.MQ#"&'#5.#"#".54732?6325.+'675!5!#3274#"3"54632%A4*)3C  /D#-DG 19:!~o 6 *>0#$,9V9,Q##4&,-&- /;(*%-6b++33X'$;(<7@.AEM%&=47#5.#"#".54732?6325.+'675!5!#67'A/]3C  /D#-DG 19:!~o6@9V$ %1T d! 4&,-&- /;(*%-6b++33 #`%@>e X,,T.*1'7675!5!##"'72>54&+#5.+"7zw9F0/")( \23@){({`*.33.(L1#B%'7LfX/JX/,w/'733##5./>4'"&5473267ZW$Ld3TT3:3:*4(%1( &'={({R5FaV3R,1-45)*%/DJ+,t{.'72533##&#"32632'7674#"#"&546WQ9M.3CC3V^!F O",E**8+ N  W{({5HM3`7#)"!E( 6)%1^,Q.*'727#'47#5!##5./7##"&3a& !&')3fO=3JN&H{({? $ #a0 133AAZ (R8 ,2 <F'7>32#"'326?#".'732654'#"547&'7&#"325k I4M.',59(#)\H>g@&3"5R0<3% =!o#>(5<$U{({TE)+) W<P-JcM|B @ykAE.0,"4!W>&1 5,. "'7%2>54.'&'#5!!#̦#bDLgc=2-* W{/{({Yi 33=&(0^,.9D'7.+532654./#"&=#5!!;26722654'#"'| %80?R/."C`z;GVx _104*= "12 NC1 {({ <(3/)$7='4[2@].33 @ZK&,.I'7".547#5!!32?&547#".'32?#"&'&5332654'zQ'2KzK9# 0 #0C( $*%*`4H3m9"@({({1/a1337'!>_;HTjN]X ! B!-"$,!@Rx+F! c6'$&,"+'7675!5!33##5'&'#5.+"7qpz63VV364?#q#){({a,+3@X3=$W2;V1,:H^'7#"&'#4&#&+&547;636;24&#""327#".546327>32'4&#"2654&#"53260g*\3B^#H}/69 ":, %n  "#! *5'2*,=35a.W83%'/{({40gBL3E9 C<9*#S x $ $>Ba1>-44'xE67!,3%,'5'723!32654#"'632#"&5#5!654'"&5473|6A/;d&!"-:c4,'d[[3G!*a{({\F636D$"1'6vS?'O3 2 ?/) .,T(4'73##"&54>7>54'#53&5472654'|/2Ư2@fHFV2 ʬP6&(:4I<"G0{({,N73Pr^HZD N=%3]G54#"'62|,'x 35% *>.9d{({?'33q 6Y1&"!=8[?,]('7327+"&54>32533##4&#"@, )F>)3& 3__3Y$-H{({5>3^+1:('c3W+w4,U.'+'7&54>32#"&5/332654&#"%5! + 8&KceT83XYBLF57v{({ '" '}]\|V\IFa!w33,]4'733##5./67654&#"32727+"&5462@\%jI4QQ4";,C&,n'B7)!> (V~Q{({S8P)YX3I% 58<"*$3- 2DJ,-.'7'&547'#5!!67d.Oe,.{({Lcb[2"33!Q~UY-,:5")'7"753##5./7&54632&U#yR3GkMp^),*' yU-J1&{({ DJ3VGK)[F=8Y325!5!##5.#"04#4,b3P3"4'"{({0&D/F"f33.:& ,  ,{s"0'7>32533##4/.''654&#"72767&#&#"] n6F3VV3 $%.% # 3#2$ ?{({O1PE3:. "&!$ 9 ,+2&(!,Y..'73254&##5./67&'#5!!6;2#"'q I<38b($fNr3>(69vK Zr8{({ #1?ZFA_ %M#6@33*8&1,'aNaP'% , .'7.+'675!5!##9!~A3H''%{({.6b++33$X,,A./3'74632&#"3267#".'32654'#"&'5!)4! K%3!%`K9bC:"9%T,P"5R3OX{({$#00):2G #!9 @s1Jm_:Q?3Z733].%'7.'5#5!##54&#"#"&5475@h>NB93`#B2U)D>=79.{({:&!"33C+P,],82N,J.$'767/.+5!##5.'-9Y KU?3)9?Y7;G&4{({9C 233LCR F7""5j, .''7675!5!##5.+"754632#"&G3>09twF&{({^6&33Y/, \'",.3'7;27#"&46326325!5!##4&#"4&#c0&;GG;1.+&S.N3@'." {({)90QR0+ 33Y&&3),<'7#"'7;>54&#"56;263533##4&#"327#"q1 4#I5N3QQ3P%!, <{({')-1=8k_  $W3^s/6 +,D.'7&'#5!##5./6&'5&r-~"F3BdE*I;0|UL{({C#A33@]G:%3(?+7qc{,. ,'76325.'5#5!##5.#"#"'7326q@5"'2 B_853 :(20A,-{({84EK7"33N4?4j" E,.#''72&/32>54&#"&546'5!|6lY&_:&: M$B0d{({Z9o2[p!H9!(# $<#$*9+K33,J.3>'7"&=#5!!>7#".'32>54'4632#"&-%. R(4wY=a9'3.EN#)=#(0 {({6(33X(p"YoIg]$TY2$6-2(+4 ,.!/'7%"&5#5!!>54#"'6324632#".#4Z.M#"(Lj!- {({/733h]d# "mL_-!,9.!-'7&+5!##5&/674632#"&xeU I3C,=,E$Q(/(" !%&{({K]23Lp/8B*5G# "fX '&,#. '7'.+'675!5!##9V$ %9!~A3{({I@>e X,X.6b++33, . %'7%.'77.+'675!5!##`:,n69!~A3H''%{({&Q . I7 .6b++33$X,W.=A'&54632>32'654&#"#5&#"#".5473263254#"753$i.$. +"0$"531;V$6 ()R 3)%Cͫ #3g;- 9+#B2* "2+)A(2  /H33g/2#".'73254'#5>54&#"3&54>5e"4YJ.PDM0(Wp2 88-F )2]$5)g9)327B%AYC) 1%'4N!1 a,"2#".'732654&#"&546s0A\G+N8,3 2L*+>*+3,M9AM*?L?DN64*!.BaR*%&54632#5&#"#"&5473263254#"]*34'2  )M.,#1',7)^6&)# C4$6 3+"(= *%&54632#5&#"#"&5473763254#"f1<31; :I,8'/='$C 2f142*W.2: ;(10I <.#4'!5!##".#"&54>323>$k>j6:D  ))&)H2 >33-&"E,, !2% ,,R&#"&546323#YId6(KE#3M.33e7 /J'69:~'.#'673#bF(B,D<Md33 ) 2L/0/N0!'56753#5.'I"5v0{33  !&, )L!!n?.'25#"&54632"2?#5&#""547326!'# '4##>U$-- ]_sX'. 0',/#Fk'.##"&54732?6323#R    %,1D.*"$ B 33`   O90% %(1  }*"463263253#4&#."##"K'3' (32-+F% .BX=0e7- C",/P#".'732654'""""'732654&'.#"632'>54##"&54632&25F43aF83 T$   #7$%%*+3 < G#&5Y2 !#@:WfXq# -(>IL. ".B  !J)cr23####5.#"#"&547326324&#"327#"'#"'7;>54&#"56;26354&#"&5463.#"B4]XGJJ33E  YM.EF 2 56P%!, <" 4#I5N6?HHiϑf,[TMG )7eE3b5)W6), .<) +Ms/6 +:')-1=8k_  $z"$%HSu$#!.'26=33265#5!##"'67%30" C3X 64YA &)+""*2 FHm33:Q'P w.5%25!32>3247#5!##"'6732>54#"#".M,/'04?;mwXbpYB2 &@28K %'3:P%7(/(D4=?S633]dP$CJV?@ ;.$/726=&#"&46325!5!##"'>73265(<6!(8)5<;X65YB %0"B3\(evR3L33:Q'P*2 GG:.>I%26=4&#"4&#;27#"&46326325!5!##"'7673265M%@'." 0&;GG;1.+&SW 64YB & {0"C2)+Y&&3))90QR0+ 33:Q'P  q*2 GGmEP%26=4&#"327#"'#"'7;>54&#"56;263533##"'673265P%P%!, <" 4#I5N3X 64YB &0"C2)+s/6 +:')-1=8k_  $W3:Q'P q*2 GGm. (,7%5./67'&'#5!##"'?3265&'533265 ,$<!!E7.(X 74YA '(90`G8p3/#C30.,8(33;Q'P ' 3$  \g|+2FHJ.1;H%26=#".'#"&'6?32654'4'#5!##"'>?3254'"'33265Z%4 "<8  $W 65YB G8$=90"C2\+ (3  @*33:Q'P$H8$*4DJ:.-6A%26=.#"#"'73267.'5#5!##"'?632533265U% :(20A,- B_8X 64YA  @5"'230"C3*,N4?4j" EK7"33;Q'P 84Eq*2 GHl^.4#"'&/32>54&#"&54632326=!5!# 65.#Y&_:&: M$B0d/6l8 C3wWt;Q' [p!H9!(# $<#$*9+KZ9D-GH33K.+%>54#"#".547#5!!32>327028K %';m-/'04?  KAhV?@ ;)T622S%7(/(D4+'#I$923#32654'7#"&54>54#!5!4#"#"&547326E5g~2HH28,u#218#9+01S1'$T>CL3F31B 6 5c"274'7&'#"&5463267&#"5 2  "(0M9<("/"& " $-"BA99:Q. $#"./&'73274#"3"5462%5!K*) "  -6 *>0F-$96G 4 3X'$;(:33.7&=47'6753S/c F@m1T d! 3f33.'6325#.'5#5!##5.#"#"'7326!)*03U/+4/"*)6% &9i;(33bA,4,Z 9 a.$6325.'5#5!##5.#"#"'7326`# #$I'o3)!("+ 0/gn+33<699I *Q."632.#"#"'73267.'5#5!#!)/"*)6%&3U/b9RA,4,ZB9;(33 "8e'^x1Ce'#5373264'7#"'&546;5!5!##"_SS);5EC96LxSkEI]Jl$ O)C$3n'1*iR^FI\Ie}II#F%"3267#"&5467'#5'%&'"'>325!5!'&54>32'"!!7'432+M(!'88OCF5(H+b"+SG?*.,8)D $Q|B-&#=8N50C )=ϛ9lM7 SDFH9H5$2 ; % JWH5J* -D_%"3267#"32>7#".547&5467'#5'%&'"'>325!5!'&54>32'"!!7'432+M  "88O#7( &)B=<& +5(H+b"+RH?*.+8)D $Q|B-& =8% <*7#5$%>0C )=ϛ9lM7 SCGH9H5$2 ; % JWH5J* -iL#53&54632'""#"&546;5!5!##"32632.'"'46322674&aaXN4*D!$R*O -s ZG i"0d-'D",,  )NZkM62 ;# F_v4`IIP; ,R?8"-[  8+|KZt#532653#"&53#'7DD%!'/D31E, $K=Ar$2??2 ;UG#532653"&53###53'73CC%-/FbE-4 MHM==Y@r$3?A1%H:L,043###53%7'7&54>212653"&537#533'=R7LMGM31c>L!&!-/FbE-3;CC'e%>BUHH7#*$3?A1%2@>5LJ'+'"#&'#%7'7&54>322653#"&537#53=D $R:- ?1c>O,7+,/D31E-*DCC$ %IY>J7#%1 $2??2&2@&Kk%#532653#"&53&54>32&'"7DD%!'/E21F- $wY 1#*4 #*(@r$2?@1 ZsI, : & #T*e'oE] e *@#53'3.547#5!##"&54654&#"&5475!"327"2USS W*8#P @cs6Ua."MV#C"$!?Q|Z)O R_5<IIp5(DwM-iOMOaEptKO%tQ&37#"32>7#".'47&543254&#".54oF: K?184H&#1! #3;=8( &)D<9%:/\"8p'@43F>7^HH8v#  L2' <*7#+=h=.Ma;"R"0'>aW<D23275#53###"'3274'4632.'#".547&54632'4#"6*SFeFGKNF>&)b  *&2@,61/eAH5=DG:587x%zHHO /O"* )-.4!@*HC1C3;C/59'1&"W8<463!5#53##!"32?2'#"54632327654#""&%!5!+/MMI{@D!'5$a5{w&'; 0!7kEy]HHr63, $X,tB .# rHg%.547#5!5#!5!53###"=[PMBMI)6T8 M84HoHGa4($w.Xg!5!53##5'%&'"'>325#vvNG+b"+,MHG՜9lM7 Se2;463273267#5!##5#"&547'7''67.74#"6dA58GF\S*#: ^(FG"`/6A)P"U&-8.$10880D4J'?9;8,X5EHHm38B6&"UAx7'9 D* ++(xe"+4>3275#53##5'7''67&74#"6w*27GE32&#"4#"6v AMFI   .9'M= B -=*27GEd'-#*,1*9- 1Z"HHC  >*Z.+  9F;7&29/E3EF1"%2++ * e-#53'-32654.'5!5!5!####".5 >>-"C =  GG# :(:i<#D8Y!$%# qHHc(6./XrX e13275#"&'5#5!!632'>54&#"#5'%p;,78jKe)E@(C 8>E!S3   G,!;I"//U@HHA5E "pB.k.'&  7"e153275#"&'5#5!!632'>54&#"#5'%#53p;,78jKe)E@(C vE!S1   G,!",III"//U@HHA5E U.k.(%  7HEe7275#"&'5#5!##5'%5;4;/Ke)GG-")7"/GU@HHだ7&e&.##'7&#"#"'.'732=!5!25!6FG2ZI% A2 4_%11 @_9 G<Cl75M $/Ju&58%X!',(.H24eoe,!632'654&#"#"'.'732=!5!o#)<\8/7X1 ,+ ?- 41%,8M9 G<oqS84X/1K=&',+5(6!N$p',(.He=#"'.'732=!5!!3632'>74&#".547B; /[,11 @_9 G<z$:\B=.!)2IBq158%X!',(.HHmUbk' !,'N$0>Z*e;7267!5!!632'>54&#"#5#"&54?.54672'&#""H8H6ZwC!Q/4FG% q@/.XEJ',06*HHNX<]|/g0 ,tM? A )M+Ab N 4$'<e"L"&54?&'&5732=#5!##5#"'32675#"&54>32&'"32675^pR\; .-MG  O% 5W4%+7C;L"2*6K( Aq?*$!< ","-HHx + 4='A#31D8&8 E4 "?e #7"&'47%.547#5!##5#".547"327!;p%<D?FG=K:0G 8,)Sx'#K)G>)OM? A5&HH # 0%: '#NI]e,0747#5!#32675!5!##5#"&'4?#"&75CaW%;(3f#0]FG py3N5C;GGQW@HHzM !>*:A Ue.7267!5!#632&#"#5#"'&5467672'&#""HF7D")4FGI*?36-DJ')?*HHMX t#-1B$B1 N  #&9*qe<#"&54>32&'"3267#".'&57326=#5!!#3267q7C;L"2*6K2 A?7^@7#; .J65W4&+1D8&8 E3#"<#4QJ0; ","HH224='@$e##"'&54735#5!L!45'9456Hye'"32767#".547.547#5!#; 8+'6J8yM0G 6,*Dd'#K)B'%%TF 0%:- R!&HHIze!5!47#5!#32767#"'&}CaW%;&039$ ~>4'&HC;GGQ*.I{Q"!e-32654/5!5!5!##5#"&'47%5##"'&5c = **GG&p # 9(`Y!0>7 qHH]N?=*(6//@t&e!5!32654.'5!##"'&5, =   #C4`HY!$%# H(6"=3?ze=72654#"#"&546;5!5!##"263227*"'&'"'4632)M#K,p#\@(W%4 &`+Mh!)'S6+3.^HHJ'Qz+N?-oX"Pe,!5!632327#".'#"'&'7232654&#"BG+FU!"#   bG47'2/V(469/3H$IMLF[&9/=,/H (e'463!5!5!###"&'4?5#""'&).8 f(GG]& r!M?1L\>1HfHH,@ ?)_@^O4^s)e@%2>75#53##57#"&'4?#".'3254&#"37".54632)+8=eGG32#ry3bA(*-7)B:-= U9HZ- 8(HH*OM= ?) :.CG x*5-/C&#0=`DAe/46;5!5!##"34'432#'#"&'4?".)B4G)B+ N_ rFl>& -=U^HH+ B001c9>6?) e(92'CgG"&'4?#".547.54632#4.#"6;"3275#53##57p+.,@ 5,3K)-EH  #(6"9.Cs`FG&&I G=)J.% 21T)1GI& ',$DRoHH##OMje ##"&=#5!26=#j#P>H iH&GV s.e7#53!5!463!##"&eek>H i.cH&GV sJe27#"&=#5!#>5*FKf6;;X*U@HH"/1e 7"&=#5!#632&#"#5'3275#Kf)GD/43G.;,78U@HH>L &/""//uXe%!5!0#"&54632&#">7'27'R EgYCJ9!  8+&HDZGEc N},4s)e$#534&'46323##"&546;54#"11 J2#$_ (+0H' 38 *Ga o !2. "qe46;5#5!#3##"'& (\|/0% HHGO7:e327#"&'22654'#5!#=6 <'RI>Q^~)57Cl'/W!)Ud7v`,"6$HH+e 7275#"&'5#5!##5#"&'4?;4;/Jf)GG%r7"/GU@HHN?@)[e43275#"&'5#5!!632'>54&"#5#"&'47%5p;,78jJf)E@(C vE T7.GG r .I"//U@HHA5E U.h1)$>vM6?) "e !5!".54632>7"'67&'"Zʏ4$JN9aJX@%<+)g A 1*+HH:=(Ad2E]F%Gj4!+.+Fbe.:!5!>32#"'#"&5463232>54&#"#.#"32>N'ER ?,\&'^ESXEVO:* #0  G3(SS( H"/aR;:$W\gSJi'L% <:  )@js+be2>#53!5!>32#"'#"&5463232>54&#"#.#"32>#bbN'ER?,\&'^ESXEVO:* "1  G3(SS( CYH"/aR;:$W\gSKh'L% =9  )@js+uXe!5!267#"&54632'&#"3'R (+0EgYCJ')?HW/UZGEc N  #&9e)#%72>7#".5467#5!&#"32>V+wN0,.'N>27+)_nB&' 6DT24'B,) /* HHLL&0  Je 7"&=#53#'327'Kf)u*;,<$ǥU@HH{*"/)e "'&/732=!5!#3#B#D"D1V[9 F<J*0S& 5U',(.HHGQe-3!!3. 54>7.543!5!5!#!"w+zC0E<5#%" 'Q32"&'46?&/"'"#".#&}}]\#9,06 p%?$ */$H 9@;l8/oI D!21 e-%'32##5#"&'4?#"&54632&#"?!5!7+"FG&rEcZB G9!  s*7U]E?>) Kf=Ec M} H2e<4&'463235#53##5#"&'47%5##"&546;54#" J20"eFG  p_ (,1 ' 390HHI   >( ~(a o 2.e $"&'47%46;5#5!####"&%5#r & (\FH_^3@)NN?X HHOnFe+##5#"&'4?#"&54632'&#"327!5!FG&rEcYC G'& :,C;]E??) Jf=Fb M  +6;Hbh 94#">"&'47%.''7&547>325#53##59.5 8q 4u.C$ 11"%:d\MFG&(#'    ?*Q H9c4B3 +7>.HHM@ e8ES2675!5!!632'>54&#"#5#"&547&54672&#"%654.#"6322675"'#G9G9W54vC"P-!5EG1MFg87XD 7+6&370"! 5E7C#G-N2$HHoGP58C):Xm+[,&hi0W9:>*A:[ F.$'/8' h}G$- ,"09yeZ#533254#"#"&546;5!5!##3262632#'2674'"#5#"&54632&#"3275.'7xOO`1o 7"4v%Iyz'<U8&W=%<3HP:.49CG40;J^&" 21200aP41MKV NISd+ ^HHK5?Q R%=*] T,# (  7K'SHH$%eP!/AYW$3X24F# ]&c6:'" 9 nxe48%#"'#"&54735&'73274&#"#"'&546;5!5!#!2632##53G@+'j&:f(0ig J*/41Gki6T :#HOOq 6lU.;6{.#-19+ZHHIsKmxe5H#53%46;5!5!#!2632#5#"'&'47.547&'73254'"#"&"3275#"';xOO=1Gki6 U ;"H|>E4$%/40ih!J-`o<O~e:%4'5%5#"'#"'732654#"'6323275!5!##5#"'732FP("^B_e/`036e-0U%3 O[JPQ5+7-u7"GH HHi+*4D81889e1H"34'432#'#"&547#"&546?&546;5!5!#32?3267'"'A(C#+J`%wDG< ,L6'5B4sG>E-BGS" "7\-B Ex*!B)0o%JhJ0!G1,T=U^HH< %*1 + dS0f&e0747&54;5!5!##"632&#"327432'#"M"FdK( # ##+?K A %;?F('(<\THH ' J)IJ31g#y)}eQ"34'432#'#".547".54632'&#"3>33267'".546;5!5!#O(B+ ')Ta&' %P:A-< > l ;.;^. Xz:A6u<x*!B/0"TY7 0!%H*.@#&;  +L@,eo &A>#327'".546;5!5!# (B+ 13Z&.:r";",A  /'8FXz;A6=KAx*!B00"TXQ_N +# a' "3 1ua%&@>$f7* !>^HHi fe.7"&547&546;5!5!##57##"672'"327FZLMLVGGMe -EFd/)G\#F95O6(^HH=25# HD$;e'3"34'432#'#"&547&546;5!5!#'&#"326)B+ 11S H<;F/B4G"$'$&/%<x+ B00[\3T.A(,=U^HH{N#%.8,e0##"327#"327#".546;5&'&5476;5!5!,x(5]1A).+2]1AVu=uN`9,jIM315,#Y:3'!Z;3N(L/3Q:./D7(&^H9,eA4>;5#".546;5!5!##"327#"32674.'7#"&)'91 ;oFa8,x(5]1A MUUPJ;9 EV2Y%#5 A+L+5P^HH#Y:39*. + +8Y9eP4>;5!5!##"32674.'7#"32674.'7#"&54>;5"".)(;/h!&P5 9$%DUJ;9 CY1Y'91DU:B%5 ^HHX ,%%;!9X + )8YI#5 M Fnke4%#"'#"&54735&'73254&#"#"'&546;5!5!#!2632#G@+'j&:f(0ih J*/41Gki6T :#Hq 6lU.;6{.#-19+ZHHIs9VeT3254#""&546;5!5!##3262#"'323762#"'732654#""&547&'7Y`1o=4v%IVW'<U8&iO7:IM8& 'C)1`1/@=4vaC1B NISd+ ^HHK5>]A5'1( NI4, f-8Y 9VeNW46;5!5!##32?62#"&54632#"&546;5#"&'732654#""&>54#".IVW M8&1Yb@G(1JfL\SB#\R1`1:5=5u*1-XHH   5:'A2? $*.<'/BqR6D'j\  NI#N)#!e7!3##"&'4?35#3.54>7&43!5!5!###!"w(  \#B>Y5+A"DQ7"'4?&#"I,6!5J#9,4)8U=XK  $dAJz(y)=B0S:J5  "U 6 2% > )(&- ?#56#5j5:J;)^H)4s8$:Y-@P? ?_.0ieIR#!"632'654&#"#"&'#"&54>7467.546;5!5!&'26I,6!cL :-0:8U;XI  ^%A#7T  $FW+A? > L5  - #> $6 6"$!#PH! ?!#;)^H /6!:9e.7##5'7&'"'67&#""#"'&/732=!5!!632FG5DZCJ[  A2 "D!1V[9 G<Dl鱉) J N$/0S& 5U',(.HeVT+e=2>7#".5467&'&'&'".546;5!5!##"34'432#" '*E*Q=D7 Xz:B4G)B+GTD6 <*?+:E $ &A>#=U^HH+ B008U;6$  8e#5327#"'&'515%1D!A<HH Eye+!5!47#5!#3267#"&'#"&%#327>cCzW&:&6j |>+B ZK1O\%;&03()HC;GG R`@{R*E@Q*"Qe-5#%##5#"&54?#''&/732=!5!5FGB%t#D4_%1U\9 G<l @ ?) S%*Iu'5U',(.H4Z"#&54>323###53654'.#"\H' / )R=*MMHMOJ#!$f#A,0/FN!HH &/D5":\E$.#"#.54>323###5H8K 0 !H"E/AnIMMHMeDi"!,  32:MIHHI13###53654'.#"#.547632&54632&#"}MMHMPJ# 3J,$2j P7$0 6-A HH &.E.:&<#J&F 67 ;Pj+.#"#&54>32&54632'"3###5W8Ye+7E"I 55[>4[: D $QMHMg0A)>,.!$+? l=E558 ; $F\GG4R6#5357#"'&'76#&54676323###53654'.#"AA>(M P#323###5BBN(M :%#8K 0 !H"E/?nJMMHM"WdxE"3(&YDi"!, 32;MHHH9^%&#"3###53&54>32r!/ SMHMK &@)-%+*((a((-HH//2% '/2h#4'&#3###53&5467632O8FFSMHMKA7,06s^Y:f/O3(HH#(7^':J<f#'&#"3###53&5467632`tޝN=DSMHMK9>DSCfI "I'HH)1X)X5=2327#"'3274'4632.'#"&547&54632'4#"6*TIONF>bc  &2A- 9@UeBD9 '/;597(O >+O"',. /UEIC1C.@+7N&1"  e1!5!463!!"32?2'#"5463232>54#"".Ep&y>D!'a5{w&B 3/ .!0O$HG5 4+j!X+tC )#FL e!5!.547#5!#"B[P)6T8HM84HH4(#x.:e!5!'%&'"'>32vvR+bOJ+SLHt9m&'7 SCO#La(14632732?#"&547'7''6?&74#"6J-8FF\S*!:)D9"_/4D(OEU.7V<9,!1809/C4J'@96<-JCj38B4&%VAy6")9-:,,, +Ke"46327'7''6?.74#"6eA57HF<(ـHU.6U8. 10880D4j Q7^HH #v# L / h>-=''%|-Gm8Kk#53/"#'&54>32QQE #*(:+.)*+I< & #T*;I4* e37".547.543!5!5!#!"632'674''7&#"pw%1:<-@,:=9*@!>?&R9A<:-4;0(@c3;7M <^HH 9!B-WO+::(,"&Kk&54>32&'"Y 1#*4 #*(KsI, : & #T*!.#'#73^{aCҔ Q ###53'#532673#"&53MGN8YY1+5=]BC[<+(HV.*CTVA!, M '7###53[TZpMHM\T\H&547632&'"###53KX($9%0 $SVMHMfpI1 ; % JXIH'?'"#'&54>32###53C32&'"3###53654&#"#&eOJ= I/&4AMMHMOR= / /N)0W,(( ; I>%HH >N+;4 {1#534>32>32&'"3###53654&#"#& QQ%K2J= H.&0AOOGMPR= / /M)J)(0 ,)' ; I B%HH@L+;4|Kt#53#'7``FK=[;|K(t'"#'&54>32#'7(D $R9,-,7)tK=% % IY;H5$2 ;|K*t#53/"#'&547632#'7*QQC!%S9+*%$8%qK=K+ $G\:B=2 ;LL #53#%7'7``Z?1c>[ޚ7#LL='"#&'#%7'7&547632=DD3:+ !?1c>W %%8%$ Io5L7#"2 LL=#53#%7'7&54637"#/=bb?1c>MK&II2 ) :+[њ7#:B: Ca2 U&54>32'"###53'73Y 0$,C!%TMHM==YhsH + ;$H]KH:,!###53%7'7&547632&'"#&'MHMB1d>F '$:$5 $R9*(H7#1 ; % IY5.cLP"%#53'"3###53%7'7&54>7633'PRPI4 LMGM31c>L$%@'Lm CAVHH7#157eI##"327#'#7.547#'"'.'732=!5!#3>;5!5!x)4+?8^/BGb^{`4=.#D/[,13"BZ9 G<UN2,J'-E#S)bӓ&2P1%*Bq15;)Y#',(.HH=5LmHD #53/"3###53'73'&54>32PPD $P%MHM3=+-,8(I, $ HZHH:9I4%1 _g14>325#!5!53##5"&'46?&/"'"#".#&(]\#9,01M}NG p%?$ */$| 9:HGi8/oI D!21  e<'3#5346;5!5!##3>32#".573254#""&WESS31> !& +'+#9=!4lRB$3=Wk'q H6y!BO# `II.3 I 4M'6MQ7.OS@p"#8e '346;5!5!##"327#"'&p Vg68z)5,@7_3DV{jMN!MmpIIL(0I#V*tGGe*'33254'7#"'.5476;5!5!##"M VV(2&96LxSkE102Fl$ !%;#j7'1*iR^F]4B52}II#ce5'346;5!5!##32?2#".573254#""& W{1>cY+R5+#9=!3mQC$3?Wj&q H6y!"!`II;5I 4M'6MQ7.PS@p"e*3'34>;5!5!##"&'4632#"'&>74#" VA+m)2YM>4#5 #:<hSR>&2."7@,hII>.?i%/5A-% )B)93e37267!5!!632'>54&#"#5'7.547672'&#""H8H6ZwC!Q/4FG-5?+-DJ')?*HHNX<]|/h0!+t9TY6@01 N  #&9ze(E%5#"&54>32&'"32675!#'326#".5732=#5!##5'l4A;L"3(6K)<'! 6V4&+n,8bD7" ; .-GG,1,D8(9 E4 ɘ* 4=':H"(?NKB$","-HH'9e##5'%##"'&54735#5!GG,!45'9韓8'456H?e*"327!;'.547#5!##5'%#".548,)Sx,JK),*D?FG-"sO/<)B'#N$&-I! R!&HHc8C 8&:4{e>#53#'#7.'73254#""&546;5!5!##327>32{PPL/1 ^{_-]E91W@oK6t%I{|' *%*6M0E&֓ :GG0.&zLm"8'^HH;2 H]e!%747#5!#327675!5!##5'7#"&!75CaW%;&88-0]FG,603N $ C;GGQ4+8HH{7~A 7te(G"327.54>75!"327654&#"%.547#5!##'#7.54-(1"xW6"C !,6)8"Mt| fK`^{a@Y* .o3+('* pO7a9A@]49HHm (|ZAԓ`LJe$%'-32654/5!5!5!####"'&5 -"C = **GG# :(`8Y!0>7 qHHd(6./?ze.@72674#"#"&546;5!5!##5'7/"'46327675##"3237632)L#K,p#FG-] `+.9N!)'`>E:'%S6+3.^HH鎦9 !z+N?.PX" 0ۥK e0%'-6323275!5!##5#"'#"'&'7232654&#",!hG+FU!$FH 2 bG56'2/V(469/3n9$IMHHIX&9/=,/H 7,e%##"327#'#7&'.5476;5!5!,x"-,@6^0AFb^{`N=4,/?,1/.G!S)aӓ 8]6A8>mH9e*#'#73"3254'7#"'.5476;5!5!#^{`Er%0':275ItQgF000EhǓK?",C!f6'0(hO]E^1A12yHH-Ve<#'#737#".'73254'"#"&546;5!5!##32>72K^{`C'3.2hOA#1W@oB6t%IVW'>,Ӕر(?& 5JO6.&zLm8%^HH% D- e+4#'#734>;5!5!##".547632#"'&>74#" ]{aD?* k(2UM)$1ObPgPQ6(1-Ӕ5@-fHH=,=g 17E5CNJKM#:31Re%'%####"&=#5!26=#-"GG}P325#!5!3XNG+bOJ+,MvМ9m&'7 SH)e36%2>75#53##7'7#".'3254&#"37".5463275)+8=eGG,894cA(*-6*B:-= U9G[-+ 8(HH}8|.DF x*5-/C&#0=aCA e'46;5!5!##"34'432#''%".)B4G)B+2_ ,Xz:-=U^HH+ B00V<9&A>g=%5#"&54>7.54632#54'"#"6;"3275#53##5' d//GM   -3K)-EH&9*5"B$Fo^FH- ?N3   U(2FI&#"P DRoHHs8,e%'-463!5!5!####"&,!Db,GGh8l&HHGV se%%'32##5'%#"&54632&#"?!5!7+"FG-V,EcZB G9!  s*7UX81f=Ga M} H <e+4&'463235#53##5'%5##"&546;54&#" J20"eFH+ ^ '0,380HHl8Ia o .,e$5#46;5#5!##5'%5##"&lɕ (\FH-_S. HH醞9/One-32>75#22654'#5!##5'%5#"&=6 >) ')57FI-!:P^~/W+   +t,"6$HHc8 3ve#"'&''7&'732=!5!#\I6 %18<,9 G<L1A858M8',(.HHe(".54632675!5!##5'75'4?&'"p4$JN9`KX@CD GG-/^ A 1*+H:=(Ac3E]FAxHHc9{Rp)!.+eG4#"6&'&547''6?.54632632'>54&#"'67&'"8.$1mL.=HV-6UA58GF] 57#4 )% 6),Y84(+++(}3PS?+ $)9,*089/D4G )% ; " #+R ' ;&= $i%.327'"&'5#535!##"327#"'&'#>;5p<+>"jJf),w*165G^1ARzgL6' uG,>#-)U@GGA/I.1T)rF2B!|-;ng+2327'"&'5#5%!##"32654'7#"'&'6;5p;,<$jJf) h%0';2DA75JuQiD)' 1`="/)U@HG@",C!258$1)hP[D(@{Vz7$h6#>;5327'"&'5#535!##"327##'#7.'uG, ;,<$jJf),w(4,@4]2A!S) ^{`Pv(!-( b@^O4^s`1HGO-? Ee/574>7&43!5!5!#!"!###"&=.5#2)DQ7&43!5!5!#!"!#5#"&5432&#"32675#.)DQ3m=1/"-P01FT?.le #'".547&=#5'l  (:FM; .j VL   * 5:f,DON Ee1"&'4?!3.54>7&43!5!5!#!"!#5\rBr%53H DQ?5#3.54>7&43!5!5!#!"w(  \  $Bl+52H!DQ5 B^HHNe277'7#"&=#5!#>5. Kf6;;WOTbU@HH"/e:#53%#5346;5!5!##32>32#".573254#""&SSSS31>+=,+":=!4lRB$3?Xj%q H6yOO# `II;5 I 4L(6MQ7.PS@p"e'^]e'^9J#8e'o8 $e.#53'33264'7#"'.5476;5!5!##"USS VV(2&FB96LxSkE102Fl$ O!%;#3n'1*iR^F]4B52}II#ce:#53'346;5!5!##32>72#".57254#""&SS W{2>cY+?,+"9="4lRB$3>Wj'q H6yO!"!`II;5I 4M'6MQ7.NS@p"e.7#53'34>;5!5!##"&'4632#"'&>74#"SS VA+m)2YM>4$6 #9=hSR>&2.2O"7@,hII>.?i%/5A-% (= LLP);31%e'o e'oE e >#53'3#5346;5!5!##32>72#".573254#""&SS W`SS31>+=.+":=!4lRB$3@Xi%q H6yO!BO# `II;5I 3L(6MQ7.PS@p"$i )2327''3%"&'5#535!##"327#"'&'#>;5p<+>"@ WJf),w*165G^1ARzgL6' uG,>#-)Y!ͺU@GGA/I.1T)rF2B!|-;ng /8327''3%"&'5#5%!##"32654'7#"'&'676;5p;,<$@ WJf) h%0';2DA75JuQiD)' .G="/)Z!͹U@HG@",C!258$1)hP[D(@{1zEe39'3%4>7&5463!5!5!#!"!###"&=3.5#2 WD'*7&5463!5!5!#!"!#5 WrBr%53H D'*7&43!5!5!#!"!#5#"&54;#"'"32675#3. WDQ3m=1/"Uw1FT?1e$7#537"&=#5!#632&#"#5'3275#eeKf)GD/43G.;,78.cCU@HH>L &/""//&e%7#53!5!32654.'5!##"&'&5ee, =   # :(Eq0cHY!$%# H(6./ln?L)4>32&#"3!##"'73274&#'7&E!89!m5#73267#"&547.54632&#";#"u2:!8{7pS7#".'#732654+732k 69 j.wv21M* 8!*K9NO,?!eDh1&>!S'%+"'>74.'32>5"#".54632632&#"51k?Y"'    .8&UD(Q:/3l(1 -PF5(@XY'"%._"I1M^*:<(QPE75"&/73>54&#"#"'532>7'&#"7637632&   3*,937#"327.!/:*7B}$pp-H(UD9$UUk)7"&54637654&#"#&54632&#7>7i-C8^)3-_2W?ZPTI%"F2*3q SaQ  G$/3*1A\=EQ4>`B%'7267'.547&547654';#"-R:Df`g~Z!H4|{JGMGoC KAB(5OK  ! )QJ&Gm'463!##".%&#"7>^E; ]J >;$BXL&ARR.5C7'&''7&{>Jb&8\%U%;<|Y%OF L)*- NI_$7= : 7G(#3 gl:6$ %+-F4726=33#'&54>32&'".9lrqoY/STC^7P* It &74354.'.54>323#"&V(#-,%PK"4FA!@uih6L@_<" /9--+C>a;&TB:U++0 HI4&#"56323##"&543x '5"|ih;+5-`>*!V qeU#(:%_%%267#"&=46;265&+732"&#"4w UXq ]!(AW8Dx(  "(\2d8{Y';RT=~  %#574632&#"32>7#"'&Vj)0$31315(]GGQ)h O $G16K$ U JM$"&54>32&#>546;&#"a.0  e2PMY2KU!tFf3 K )<*X^kj$)}]74632&+3267#".nY+, 53(W UU4=,PaM.9i+`= -O/#.'&+'32>7'&'767+.54>32m`5f~638. '1#P 1%(:I;G)%HE*6Tb g5(U S 9'#A (? >2.:'K,%"&5754+73'3267'Nn-T|-%9O,^5R#"'-&23##;#"/#73265.+5%0"j6b- %D/, 5%+NH_R0R.!!(R&632&#";#"&".546776770&:[/$IcW~@$i;nU+/3Cb Q@$GP*DF$%DK=H \q34323#32?672'#"54>7654&#"#&dWtIFB ,?GLE6Fn",>;\#xG.K&)!K%;( 3 ]0}2>%&!#$".547#'!#"327<$DD2 vʐK@L\( +G.i1SSL4 2KV27'75.''4>)C& GM 5= );,>I3#ZKuCq +5&U -+7265'.54323265'.5467%&'&#"\5+4 B"+53n88/1(:'Lo+#,1/ WqK>c?,$ D.3 y     1<+f8$%= CE\"4632'%''7"&7"3654@cOPn[N4BQ$> Iy5GL4&#"5632#"'7326 '%'9BG 18D_-~BS&F<7;0H V $><#n3N8wRc$7"767'63.547.54>32&#";I+MPr* ^MS<%>>!d-*,H|?9 DeU:C2A)8%$5 S6?N +3267'7.'#732>54+732k 69 p)t+X 8% K9NV,?!`4 SS) D>S :SL'46327#"'767''74&#"327#"H9Aw4;(\ 6qPx-$ld5FYS F'-6Ls,>//P*? +77>7'7&'4637654&##&54632&#sE3*4o )-C8^)3-_2W?75 SJ%"4>TFM  G#03 )1A!?,EP/';#"3267'7&=47.547654'y8|{JG5,4s`+<~Z(0(s$QJ&HfE5)aA)H(J %'463!##"& '%'.#"76[H; ^JdX9%!X'&6@PM-5BX}Jo,"H#27'7'7654&+7h9gv5ɓ +,/O2U[Hgy R326=33##"'4632&#"'%il/8lnmm]\I+-+NX8(z5)ISQYTf JP'+74354&'.54>323##"&'%V4',.OC1PR+6?+ih7'&>+;%_;' .:->z ,?Lp9?*:U),/ewEp J23##"&54354&#"56'%fE6ih;-5,` #1 988fU#'9&^9)!V -eF]87265&+532632'74.#"+;#"./#5$1V2H 3",>>B;.I2dQ n (5( RR/-HO>]i<; ;J]R R 72#"&54626546;#"#"'47&546;#";#" !'H9$a( {^EBNW85*(.&`)%t^:IW);&#"3674&+'32654&+5322%,#'9[2! .LK( ,D?D~'XZ&%b1B> %!)#+5&DEa/Z;L@L$+T' QJ5h !GU @2#"&5464+532#"&54632#4'&#"3267'&+'32!!#G`0A9^֍nLS^&HF*9%7H 3XVG,&,$-g?QJ59FcFVdPCj`G:EM!?, #,& ,R?H&5432&"72#"&'73265&'#"&'73254''7&54>32.#"KR?&r&< ~W1n8$@$0b[fi=r Mc*^SE @0f B`3,@aM "Ge&&R+#M. E=R9;*=BW16I33#'P=,.+%2654&''7'7"&54>32&#"%2#"&'71>2RAbZ74.#"326?#"&UC,X?3ch  i) *B`'"  * FX>M^(:=*  *%ZYY2)&  _d0F265#"&'>74.#"327"&54>3273#".53Og ! .7?X8ZL A.H91q*OVO{J/hzpXJ b   F:0DUU@ I @F+-(9;)>'SM1)?TQ*a'46327#"'767''74&#"327#"H9Aw4;(\ 6qPx-$ld5FYS F'-6Ls,>//P*? @%2>54''7&#"#"'532>7'.#"763>32653#"'5"-H*"K9;T*=."3 5-.<'$6;'&-t'F!B-%,%4="9"6]HKV'&;.@BRW H 8 Cy#CA( R F<"&5467654'#"&54>7654&#"763"267#"3267zkbfg &y'{m3PIB765.#"76;#3272>54.##l+e#HYA=1?(Xk"A?[8M3H2:@%Uk:-"b5Nn5/3' 97! *D=2D@A1(5 8%i! Q8 'P:1''3JO     "!G4BO4>32&#"#"'#".5463&'67&5463&2654.'3254&'&'"I 74a>6Si2gJ$ l1PP*Fh4]&  uH! HK.)^"6Qd\C0U>).'I)g**  c(; ,,,< 2F)9" 4%!,@  #FP".5467&'73767'.'"#&'7632&#"#"'+.'732654#"*L@ 211o2MU .=?$n?+51=4cJ3-#"H3 ' bUO  :"%  #BQ1J#,FJ4#"#"'7>72.#"32#"32?&5432#"&54325&'&'7326S 5 (M2s ^hnhZ& OQIHL=9KGidGf0n4[D0_  L* ?() #,,!(  RAyPC{  BH1L37&54>367'.#3327&54;'&'#',*=#6&f)TD 4J6%'+.5467"&54>32&+;#"7674&5472 NZ<'$ ^y((=*S:m08 , *B$ I#'A7y' gTK:*-* S; I=#"D S)HO73267".54?654;7632#'&/#"&5467#".467327"&+*i .4'Q%# k'rL:J N-%5B W' >Co1YV +5%<.;*O ,, =#1I(G) )*(' Q(9,N2"+>1d+HNGN7< 8LI <54-<>@\4%&'#"&547327.54?65&/33274632NB')Q1\aN?2L>w *HG*g6e(AQp &2U,4~T) фyYn5645=JS!C.q( (:D;27c50"3%2#"'#'&'732>7'&''7'7&54632&5l% /bzbiHCT[219 )]Sj NKX.`E 'XT2GL{3@* ,$s0W3b@*BJ0%4#";!"/#53265&+7!2632#"'532kp(!/gK - (U/;j7Y/4 97!K>#?++[R0R,$LR:?!1`BNU O e=3632&'#327#".'#;!"&/#53265&+72;(@$tJr/PK@!  !)(2&N3iN (T/<k?)Nu/  E 8&([  RR,$LR2,%2#73267'.+532654&+5>;8GDPNSZV-"".1:g.u cp 6I4)CzG9[;(U%&V H?! 277>7'7.5467&+9E&9 ,3 iV04341 ZS= $C*Q]M.[$.%2>5#"&467''7&54>32#67>54#"(c>xjGT<,X.m?M-WtlR@--(")P#/9@{`;pJ 9fZ;.=*5H<$C1 K+O- :"6b#+"327#"&547&54672.#"#5'7.?.2v4^n=WTD39Bh7 <Lz>*65N b\Q sA%#"&546354#"327#"&54>7"&56732&#";233#5#>61'0-%;= A"$C!B.8 17)@[%E' oo$!7")2$4L'Wv6++ ,`J*$! J&$ koO472&#"#32327653#'#"&546;254+27#".54>3.jd 68 '#$TV,83#@;.mm]1Mb3L_FRg`= "0X[C*+;3UJ G*& !2( (i$]I#,*YG^oH'=fA7]4*I" <2654&#"'&/#67#"&54?''7&54>32E% =!B= Hp]15L?ARpƨBd%M36P%c$%2.!' -6$1K#4P6I!,B U>_+M6YT.9@ $)!0&3 &84'37>'2#%'7"&54>327#"&''%oP :1YZq  .WAMfIKc{iD,%BU"D9+ $I<  ^BfZ;D'*5&-nL<7PTG>2#"'54>7"'4>54'76323463236grK)@.<=WW=jP"P'0ZJ;UU;F,I.u=7654.#"#&eUmmtHFA!+?HLE XG$ޱJu+*!;U U'U8265'.543253#53265'.5467%&'&#"R5+4 A"+53q6oo:G+5 9'Ll,!-1/ YqJ@a=,$ D.3  1;+f 9&%= CG\ !"365446323#5'%''7"&%> IdMQlZllN3AM+!6.H69CL4&#"5632#"'7326#5'%3'9BG 18D_-~BS&F<7n;2m0H V $><#n3N8OSRIq#)7"7673#5'63&'&547.54>32&#";J+KQmmr* ]''S<&=?!c,*,J|?: C7lU: !2A)8%$5 S6?N5%#5'7.'#732654+532+326735n)u"0%7")K9N!69qm(pS)7$S&8SM@+>`2 E'/77>73#5'7&'4637654&##&54632&#jE3*&z oo)-D8^)4-`1W@66 TJ##5;&FM G#03*1A!?,FO+/+;#"32673#5'7&=47.547654'o5|{JG5+np3q_+;} X(0(s*QJ&F%~E5)aA)F*I  %@ #%&#"7>%463!53#5'%5##"&FW&& [H:nn:!]LcYNH# APf[I!33CU273#5'7'54+7^8fxoo6ʏ,,.N1ZIfzR!326=3353#5'%5##"'4632&#"/32353#5'%5#"&T3&)3 0PC1PS+5?.imm;%h8L=d;' M>?z ,>Lo9?+:_xEpg),-"2353#5'%5##"&54354&#"56]E6ioo:i;-4,_ #288f>eF]j#&8'^9* V =7265&+5326323#7'7.#"+;#"/#5%1U3!"K;9ln; % 2cQ n/ (4'!RR ,ID ]i 0  ;J] R0R77>73#5'7.467&+w:C'9 mm-SKiU13441 0~S>V_ M+ 932654#"#5#"&'7>7''7"&54>32#76732673GP#/<n;d,DU BX/W?M-WthR7 +,(< nC-:",P&'>5#(<9fZ;D'*5H^,M6YT.;?/F!( H$4 $%3/!'.6%'.+8%3275%'7"&54632#53#5#"&''%74'37>IIJc|-XfTXs  mmbDU!C@Q :6%-BfZ;E&3=J;  aq=6PT9+%*432&#"#.֍ $&3:((zx : "(e&4EL@#'#73^{`D3?73267'3265'.'"&5754+7367&'>72&#"#"'&,8O$S@)LMA-Ri-)05nZA*(DX\ '1`A!7-.6A;+#^5R%(@K XC!")8 =;$873267'"&5754+73>54&#"76323267#"&'-%8PLRi- {F)92@*M#A?&54&#"763232767'72&32>5'.'%32767'eX;O\')77]{`89Pj-'24nZ?,'RA11FH-2 ;.D "(:'@( ēo^5R "(AKX6A2%(#-4&#"76323267#'#7.54>)*92?-I$@?%;TT;h0d8[B^{`$?:!=WX=o a :'-70':G%Z7 ɓ*G.*= "[T3#.''#"&563232>7'.'&543253To$*@D5EW*\L] 0LT6  * Dk"=*$n S$$ 9Z3,2I4    @T,73265'.'&=472&#"#'#7&'&'X k1:N Kz(=<4.Bd^#/ 8>$]{`OD:H1' "'7[< +!)4,E)Ǔ ,& 3%2654&'"4672&#"#'#7.5467&5)OFhITlp^@-(FWFSS7":@%^{a2N, [47*:.#4;'6CFCL[C G5/H*Ɠ$0+AS%1#'#7.54>54#"7633274>32^{a3M- >XY>l4A/Kvc=XW=>/ 2${fE퓓&2..@ !2gS90:)$.9)+`-< G67''73'&'77>54'" XRBV8T<;JC4IV)96( i=x)' 'L; ' <2654+'767+&'71E= 9&%/,-BhM`A,0)8 ;0-8=9514>324.'#;65'.1CQ-=mF*L+_80/; B# [/+01>.E94JN/ > 4T267#".5432#"2>#q ,v6=Y-D*N ,-t(q# 4632#"&#3Y'"!#2^e#)%`"#324&5432&!05Qڑ[*a'0"D m j P^!"#324&5432&2"4!!05PْY*Za'0"D m j P8 *TV= 2#"&546'7#%7#')1qe[N0&&%#E["#%7'7>;)!<[Nrd/"Gm1pE#6&LX! 4632#"&7"#%7'7>;="..""*W#A&<01^-u&"-+*"-Y<K&'#".533275432&#"{4 524^\$#?$%*!-^D} 6b2*#K&'#".533275432&#"{4 524^\$#?$%*!-^D} 6b2*#%!5!^72#".5464&#"326.;& . @p %()2>+- & /;j2)<'"%!5!=©^5B 62#"&5464>32&#"3%#"/732654&#'7"&'"#'$,#9;#n 9Ckkggi"I0Lg:&*32'"+2>;g)1"V>UkJ <2#"&546#34&#"5632#".54'7326h&,($*hh9CL->u9  .Q22" WB'9<*'1+1N X 9  :)<.! " ?LJ9 32#"&546'32673#5#"&547.54632&#";#")1)"62;"<}pqz;qU=nYe/*/L~}K')%"3'! ;@k-[JA*:':HV8@Q!F ?2#"&5462#"&5463265'.'&=472&#"#"&'( 5,"%-$j j2:N My'>:6/Bc=Pb/.LN*<)P( # "%).)!+G2& #'7\<')45N';<lB 82#"&54#"';2673#5#".'#73267'&/#732I>' &$L#:7k .upqx6$>)$8 *9P)" 10D fC9q1*3 U#  TN4Y <J2#"&546'47"&54>;#";#"27#"'4672#".32654.#"( '$5fX#G'! J<#I&)?TAM).S\PyQp!#!(=*" 1(!G/D3"5 T5#X.Y~Og;=v pV]Q@3'0 972#"&54627+.5467'."32>5#".546(')",$1gE-L #>*49*#y<(, /:(WB*)1*7'.#"7636321 '$5Xu%' C 66% ".4*+ ;;W*@.&6 6.-A%6AB"'" 1'"G#?6jHf0YWE8F&7_JMW&(>-@FSX*Fa +2#"&546353###"&'7327'.#"'6&1($**gyjopi{M*r )P N-L"=+*&!2+'lQ#_S:[ /&0;[ 12#"&5464&#"7633267#".54>)205+:2B-Ko^.c9wX*NK->YZ>R+&!(&# dQ8-:2'XE*\&>)Q7+>"" -:2#"&5464672&#"#".5467&52>54&'"' %,,4o_@-(FV FSR7-KM)@b8# X7724HfJTW)2))AMZD F57O($4/AR'3:'7C  22#"&546'3265'.'&=472&#"#"'&''0'$*: j2:N Lz'=<4/Ad^#/.LN*jU9Q)$#2+G2&!"'7\=+!)45N'7$ 52#"&5467 54>54#"7633274>32(!$)"5x>XY>l2C/Kvc,BMB,>/'%{Hcb*31'!9.@ !3 gS8)7(.9(7 `#8d (82#"&54%#3%#"'53674&#""76"&533267c>& '$-poE_$H1#&(M,$ %%jsM=(Xt`*" 1n`P 99!Oc*7Rԅe=&!QK"$*11 )ESqO+5G> *72#".546#3".=4+7323767W')  +rp+E&&[<%# (CI&)>' " (MO$,! T-0!  Y 4C ?2#"&5464>32&#"3%2#"'#'&'7;>7'&''7&d&')"* 553b!>9>& 6g|fkKCWb" ._ Q>*)1*,  J( 'ZU.HO~5A"'59e 172#"&546726=3353##'&54>32&#"|&()"*z/:osopr +M0311'$5(8@,joqh(dU'%8().%R M#6GC1"'%"2(! A*:   k\=" 48K/,A?c<' (72#"&5464&#"5632353#5##"&543O' )",B"&=kpqj;.8+b!)" 1*6, X rj$ &;&`+ 972#"&546#3267#".=46;2654+532"&#"N& )"*qp4wW\:PA. `+EX9G|& ",)" 1)A}3f9 ,P3';TU> W +2#"&546265&+7!2;!"./#5>)'/4.>lIeV;K'W*-'(!-%NT\D&H!] U TN 12#"&546%#3#572>7#".54632&#"[(,54popΣ6*7E9's*1"5342#)>(#$'!R W&9a32&'3654r)"$'$6rNgs %! 2QV~ ?+" )2(X*11'" VHm"45V]_8l+QO1 R ^6E`k (2#"&546#3267#".54672&#}& )"*po([ VYA\,kX4.*55)" 1)+b?+GD%Q_N,;lwK :72#"&546#3"27+.54>32#.'&+'32>74&R2165poh+'1(;L5/<fX z%0< V <*91%73267'2#"&5467"&5754+7353#54:QJ()'$5Un. pqV(".*<)2&" `6T$pM 332#"&54>2353###;#"/#7326=4&+5''!* %&1#mop S=. 'F1, *..   7&-5a T1U,!*U# A2#"&5467"&547&54;.'"".=7654&#";27s& "$65̋ O+@-.Oy#=WV8(C$5YB?L cIxMON34"%&"w3$SP %@H6Q  !%.B;)8R7\( )'%"5632#"'53254"&533267 >$!0NS#G0"&%NShpK<(YqWvQgH88#Md^,c3@T Y 5)1"&533267"5632#"'53254.#5'%3pqK;(Zf1"!0LU %>'!&%N #*p=Do(`3?V YQiG+0$Md "W#"&##"&5463267 +W t5#//  E<Y]=&%( f`w'27#".'./&54676;53#";(  ()  % ,5#   "! *( 4`' ,T326=3#"&5432#V-!;-6BkR$<$K4)5Di/EZ#".'6532=35!5!## D*#.)gdAV  B %MAA1|".'#"54632353'32=!/  <1B (G2*)3x.@*H4@x#"&'>753"&#"32>72F.&4qN-(ZA;%\+?J)&9-8\T!1>u$#".54232>54&#"#"5432327 LL?.S(d$).H3+)0C@,-=,<$% 2!: $ k[5654&#"&54>353&8 i<=20=32=O >"$  5nY)!RR$6O #".'3s,VjH.2tIv#"&##"&54632675! f r5"0- 8 4/H N9$ ( G;;Be #&'5327%326=3#"&5432#PcSVbfRZ\W,#;O2CjR&%$2)((B4)LAi/D  gd #".'5327'"&547332>2+iY$G%fQZ]3P 2$! ' 8)(Wf+)MP0/'&z#"&'35!q?#9-.L-X&9665$5!5!2#"&##"&546326788v  q5"0- 11l0013 N9$ ( GR2!5!5!326=3#"&5432#VeeM6!;P1HeR&11p11nJ2+dhLBo$E  @ "#".54632#"54654'&/A! "HQRG'!!#6' J:/TR1/*G$1X 4632#"&10% !$%% 1(00 *3Y327#"'#"54?654'&#"#".54632327"'7&'&54675!5!!5>54&#"cOT]cQP_>  (_ @JKAXZT]^ZM>>|^_|2%,(zBMl**=! 9""3 # L.3,KJ" 8##1aNAAO0G) @45Jfq?455X 4632"&#+5;+,00!H k@``YYE$!&00FAA@ =G[#"'5327'4&##3263>7%4>32!!#"&/47#5!.#"%"&547332>53@kL[]cVX^8Z,kaA6FzajJ" &=kFTv8BLEt'L4OG^v7R/ BUI-$3 V((A('7[5!WYA%EO9&5ZW2AZn"Dk65 в$Ajn+=5KX=I<.' BW &GQe#"'53275#"'5327'4&##3263>7%4>32!!#"&/47#5!.#"%"&5473326534iYP\cUX^lLY]cUX^,Z,kaA6FzajJ" &=kFTv8BLEt'L4OG^v7R/ BU&%)MV''A('V((A('7[5!WYA%EO9&5ZW2AZn"Dk65 в$Ajn+=5KX=&8 ?F BW AL"&5473326534&#"#326!2"'"!!#"#53267{BUI-+KWBY- +Z=v_6F@Cq\=Z5%WMFu'L5D ##$z0X=I<@E CV8[g5 41*H8*AXo#Dk64 !AA;8:Q'"a&"f'"c'"'"+'"i '" '"o '"\ '"'"l'"['"'"'"'"Z'"}'"zz'"E'"'"tx'"'"t'"X!h'"/# T62#"&5426?5;#####"&54>=&'#"&54>54'4&+532676&6+;@@cAN/7 '$+$BJ;&  &8\>]p% "3[9'AFi JE>&:*C$ &WI]7/$;" 2#"&'67&'###535463235#&98F5̈^(8U?CK$>! c/nwu@}}kc52 |-{ %L:cA8'!f# 'bpLT[gn@A:g*P5 B62#"&543567&'#5!4&#"#4>323####"32>2#"&8&}-{MwZ2JC*@"C.am@_|:K$>! X:p+%/|T[gnAf>H$?<$g:A@8V!f# *_p@'&&@"z''&@"z'(&?"]h')M&",'"zh'+&",SX X4632"&26?5;+#+##"&54>=&'#"&54>54'4&+532676O00!H D6+;pWTTJ@ W/AN/7 '$+$BJ;&  &8\>]$!&00 "3[9'AFi JE>&:*C$ &WI]7/$;" %1 %,5% ''Z''W  ", %(E#(K#"&##"&5463267'7 D< r53/!45 @./1P4& Vk_B32=3#"&5432'7N3?:O3>gJ'Dr45p?M|{D9X-= a60''7'327#".'.546;53#";035?  *  1#,",5"LuW    +"J#)L&%3#"'53232=#3.XMG @vXeT58Q;1j%#####5354632&#"354632&#"WSSFFA: :A: : D88DY8?E5RY8?E5R ####53546;#.#";SSFFA:EK: 8DY8?f5R####53546325&#"3SSFFA:M@:'8DY8?G5RD+#5&#"3######5354632&#"3546323DS*:SzSySFFA: :yA: Oi"5R88DY8?E5RY8??")######5354632&#"35463235&#"?SuSySFFA: :yA:.):'88DY8?E5RY8?͆5R&#327#"&5#5353##5354632&#"V'14GGSSFFA: : DF+(DDY8?E5AO3273#5#"&5##5#"&5332>75#".=3;.54>;#"{10_XPWOAQVT) !!ARX$*,: w9B-=3!!!32=3#5#".5#"#5#"&'332>7u+3+-,Q/=WO:k$9% 6**T) !!AQX$*,: 6&@&$BDGaJU'!1%&+9O8G6-+2*A8@4.54>3!632#4&'"##"#5#"&'332>7u+3+-,>]dOX49*-X6**T) !!AQX$*,: 6&@&$GhaI?>"H3l%&+9O8G6-+2*A84<3273#5#"&5#3#".=332>=#"&54>;%;5#"10_XPWOAQ\V=_6I%Xn*-eX%O;C= 0%FS]F4D8 E;C.~"H3O;,-2hA8F4.54>;3253#5#".5'###"#5#"&'332>7u+3+-,+@XO9l1D$X6**T) !!AQX$*,: 6&@&$BF"JV%D7-}l%&+9O8G6-+2*:X&52- 273#"&'3J GRC@OG*RIPPI%-8WX'%X%>53+533"4fW,?L:ꥋZNT<v3R0! L :@X##=47'3>7538}rAZWzFVW{p"zGx)qA&X#!5!W  LL?4X #.'!53:{lWAZ WXamtQ: Lw9X4&#!5!2#!5!265|Tbxy\WysBWLY[LVC%!#467>=!53!W$C;6 aW>MWS`12!/ Hᕙ1P+7.H?5X 2!4&#! o]X[X+7^@%X #.'!5{mWAZ>XamtQ: L#uX4&#!#525#5!2#[Pux<oWtESgdLzFL}a2!5353F FF<&<&<'&<&&:}FX&:FX&:FX'm:6X&X&&X&?:X&1 X&3- (X&)=:X&5X&F'@&8X&9X&%!&H0:X&C3FX&u=9X&/98 X&ME?X&ZF3X&>8&X&)%X&<X'#{X&>&:6&09&?&8HF#53>=3>Q;fhW):WD'DZ9q #4&#"34632354>#3 r]NVYD-:/8**H**HH!PGS_\;A2)1''4,&-$'e!D]`[`]!e{#8!;V RX <&5":W RX\ %!#3!!!#3!!#H\TFWh[ ah#S cU &`g&?5!#'7"%7"''4 i'/;` ad<_- #&'#'#&'5o(O&i%pp%#T eQ bll"G #'5!#3!! 8&u M K 1k R&>7%37"''49)-6e@X$>/ J%##5##533533533##4 ;0*XXZ ;p Dd22^`_`^!!C O&'3!#3!!UX'.54#%%h47NP%4)|r-7&'5!.'5!.'5!g/W$"!W4Wd%(% % (& 3 (( C7%3V)-X$t|3!!!#$h56% &|t-.%!#'#&'5o%oq(S!h}kk}S  %73#&'!#3k _n&E `tj&N hepK'#3%#3#3#3#3l(& j '& 9P(& ~[/(& f#(&|p'Wl*W;\W\W@X 2j-X d%.:%'.'5!>7'67'67&'7"&#!567i> )2#W D. 0tR,-" 1  (&},  wT.'%v ''7237'"#'677{z|WUWX \ X|}z|W^!TX ^V}   7#3!!! `&  h'&d !7#3!!!!!#5&'53N^~X d~#Il~OW"$@aUg'Xj'&Iq%5Mmm$6ff8"!#3.'5%&''foX!k %   Rer)x&P i?X%r %   b iis'Lhd{:A%#5'535&'535&'5333#5&'535&'535&'5333'5!]!ee'>e!D]`[`]! Ee#Be E]`]`XcX\&5":W RX <#8!;W RO(&|,9 #&'5!9S'Y DtC##&'#'#&'57#3%!o(O&i%pp%#T! Zo eQ bll"G  a(c,,#'#&'5%##5##33533o%oq(S!` !y ! ! byZh}kk}S u    iq f`, &'5%#'##3!!%3S!Y%or'U bV(.}S S}kk i'U$|5!#73!!!# ^($m56L#&Sx-.N&< 7%3'5!#V)-^'X$Q  #'#&'5%3#33'co%pq'VU),[d)i}kk}T X%l)) ,&.##5#!!!!#333533%3R!z& WlZ&E`z\V'/R#u%  _&uc'&N iq hQ$%'#%3737&'5%#'#UV)-),xT!n%or'XX%T f}kk,"#'#&'57#3!!#33'o%oq(S! `!Z&h}kk}S  h' a)%^!'#5##335&'5!373U8'=k 6=X ;8),u 8nN6pX% C,'!!!!!#3!#3373#/B;.Wl'C&E d~ZP*,VR&:9_&u'J'&N kM a[$&|",33#7##5!#&#5'5'#&'5$l၃P!& ;4(V9l'p$L$'Q|w..S%=/VUfk%H~%D #&'#'#&'5#33' O(O&i%pp%#TZd! %GQ bll"Gfl( .#'#&'57#3!!o%oq(S! `"h}kk}S  h'!g'#'#&'5#33#3#3o&oq'VN_Z_#Ili}kk}T N)h'\h&&Iq%B#+5!#3#'#'33##33%3 c'H cl<^RkV(.Wj&o(g'T#}%:U%# 5!#%3%5!# ^'V%1^'SL%Q.!.#/#'&'57!!#7#'73#'53!!p%oq(R"l~V  b% a~!, xjllSL<GHF"  5!#&%3!!!#_'& $h56L!&T%r-/N# %'#-373%5!#UV9V(.9%1 ^(UL%S|%33#7##V%1T$i၃50&4N$Hs..73!'#%373337##zV9V'/9++,%j . &1QZ#Or/0 . Y %75337&'5!#5#%5!#&#5'5# ^#T $L% o(O@l&p ef"G%HeQPfkL(3'7##%3%#'5!0$h y !  &V(.]'u Lr/ |/ !  $UOkC#,%#5#/'73533'33###'33#VJ#I cJ(.])>jQ ^vv&IkUs e()f}%R%[g( %#5#%3533'#'5!NV(.]&~]'u }vUr e(&#OkA$-#5'#375'5!3#'#'33#33##]'!J Zt fl:_iQO Uawkl&p(h'k}%T#0&#7#5'#5&'57'##335&'5! p%oq(R"tM]tX bM(jllSW fZNXZg!#33#3#35!#N_Z_#Il* c'"N)h'\h&&Iq% WG87#37373#'#/# `*,9'/V9V! h[Q#  "7#333'5!#5#'%3'# `%nu ^'O!&8 yC h(vkSQ$,0 | A##'5!7#'#'33##33]'u fl;_NjOkl'p(h'N)}% &/5!#5##5##335335%5!# ^'% !z  !\z ^ ^(S$   t   frjkS%'#-373%#3!!wV9V(.9%1 `!UL% h'  #5'#5&'53!!!!#p%oq(R"_ 7l~V xjllSG (L<B 3#7##%3%3>$l yO!&V)-U),Bu. |/Q$.X&X%}#,4333##'##333#%5!#%3$Aقc&J% &$hL̓JL ^'V%1}C-.e(%!|t #SL%&,1:@KT]c5!#5##5##7##33533533&7#35#35#35&'#35#'35#35# ^'TLV! %   &%n]I]_^Jl76l{!- ^JKJlKI!- lLJ7RM<Q= &   |wDKDͅ F5L(DLu# F5L# L( ',5;FMS[c5!#5##5##5##33733733&7#35#37#3'&'#35#'35#35#%%3 ^(TLV "M&%n^I^_^Jl76l {!- @.JKI#lKIZlLJ 1%V%1RM<Q="[|wEKEͅ F5L(DLu# )"4L=L L%I*%%3'5!#%33#7#aV%1 ,E(V%1$ 6၃g&N$.=L%V;./i$W&7'#'7373'#'737375!#8%8%cd8&8#&c; Q!&6K6K7'Y0P(NW,7'#'7373'#'7373%#'#&'58%8%cd8&8#&c<o%oq'=86K6K7'Y0PD h}kk}<0G8!7537373#'#/#5##3J `+*8'/V8U!JJO Qp h]Q# UuY J27-37373#'#'##5##533533533##V)-G),8%1V9U?&4 TW] ;TXL%zJe&?Za]aa!!D '7"/  b. 5!# _(T'.'5!3#&'53w$  fq g(M't$!][WM! C7%3V)-X$  7'73'73y<il> kuy*Hty,F5!#673#&'!#3 _'&EYnO[T&N gY bKj 732654'7#".547&'767Q/0I]SI89{R;Z2!D;J(:AF7yCvH]Zu)AI%!4>/B9IX>H3267&54>73326?3&'#"&5463237#"'#"&54>73#"3268  _= ^) ?*$`n>O %$1"*<6J _fH*96P0D 81V RNkPE@>KF",,SP/=?4#%7IX 23254&#"3267#"&54?#"&54632>?3)-&,$R&>)OQ/>rIM+>(.! Z4< ))!%5`?OX0 hZ$x 6FG6=@2 Z7X3#[X^X7X"&54?'#3673327@_i?BZXZ .kZ5MPQUU(xxFY?X7?6XhZ 6b,%32>7#"&54654#"#>32&#"632-$ L@d <)`AVU6S(-6H.- & ,W %/GH>RP-C'nT$,KA:<F6FOOp "32654&4632#"&cFsT=FsTqaqa`R`Rզzզ0b##"&#"'>32327]$2XB .P 2v5X F#0l'#"&547>54&#"'63232654&COdiSejJ;#"*;2KZI^~9:.69RrdSOqtWK\7),)/J<;~>E'=E'=32326?26-KQbGY"(%1  > % =%&#-CMTPQX[N2tZ  z#/<?X)332?3&'#"&5463237#"&54>73#"326+&>%^) ?*$`n>O 0L1Y _fH*96"4)RNkPE@>KL(WL0D 81#%7:l*423267#"&54654&'#767&5463>54#"EQ $)-XYWKT,/# _!1I:71lH7.HQA &d TI-+2Wm>7N-G 1)9TX)%3267#"&547"&54>73326?3L-&,$R&>)OQ$dD _= Z4%5`?OX0 hZ*n)TO0D 81V,Z=!l=GO'632?6323267#"&54?#"546?654&#"3267>54#"FO40X9N==xl4[*(/ )!2P2X"3>327#"&5473326?3#7&#"2 #5#X-092D_5$ZX_)1*"5NG-4 Q:9FA.I!CPt5g'3267#"&54654.#"#>32+$$)2R %A*A^(!<?_F+D+OT@9$7i2B]7)[Z3#"&FC(^9X732654&#"#3632#"&5P,D+2)_,Z0-E%dYBqX>K8V1-GH!cZAFl,4#"'>3232>7# 54>7>u_ ]%H2ul\S > 1Q=$\ +FB$SNUG(+R_BX +6 #*@$ =9X1363232>7#"&54654#"##"&54733267&["%,W -$ L@d <)^<#52D ^=XF6F%/GH>RP-C*TO$29)V*OX0732>767#"&5467&5733254./3#"'J7" N&QM_u"*BZS: _ZD3C0@',THvX3M'MZs6%"!)-c7I b$/73267#"&54>7&54632&'7>54&#"C9@UTWZ! #H;6/,B:9F)/=lpP(D!2V:H,.. 8 "+.+l%2.#"#"'73254.546# 8"83#.CB.}PTB2K.AB.Il 2'#?25L.K[_9>U847K(9fNX73267#"&5473-&,$R&>)OQ/Z4%5`?OX0 hZ$xZ8l 4.#"32$4632!'267#"l,"/D6.SlTBT,RK +>[a'49;87Au&ShOUPO0&l063263232>7#"&54654#"#654&#"0+mOQ)",W -$ L@d <# -Z4-& rhZF6F%/GH>RP-C6Z(%5#3l 632#7&"#>327654&#"+mOQ/Z$T"_ #5#O* -& rhZ$x1Pt5NG-(MZ(%5#Dl&#"32673#7#".54632hK,D+2)_,Z0-E%dYBqX>K8VϷ-GH!cZANX'%3267#"'#"&54733267473-&,$R&>)U)+QOQ/Z4-&# /Z4%5`?OX0 <3232>7#"&54654#"#7>54&#"#654&#"0+mOQ)"9# L,W -$ L@d <#Z!# -Z4-& rhZ-F6F%/GH>RP-C $Ȫ "!6Z(%5#rrpj#7lz J l'.#"3"3267#"&5467&54632 +4+343@OE=9WQ6`;T6"2wO?m%'27].5?U+c`@g_@a-GAJG41X%%32>7#"&54654#"##7!!632-$ L@d <*`R&,W %/GH>RP-C'RRF6Fnjd#Al!,"&54>54&4632#"'3267>54&#"Yz$A-DSF&S>39[Tz,fV%735&2^)  '?S:[O +<9[ _!5&K[X.% P`^F#VM0D 81. p632#"&'732654&#"qRdaq=eS,JFsT=<4XzF=1Z`R<O,p%#"&54632&#"327Rdaq=eS,JFsT=<4@XzF=1Z`R<NX"&547332>73=Q/Z4-& 7&'7'6_I0B[R S_'N5'"M B.3,=p$dJDyT>,>[N@+  0*yu`Hd97P%'>54'#"54632'&'32J >@eq%=!Zg$V<5|P0$T>e'7R'6?&CD55-T6S Y_fT yj7P 4632&'#"%&'327$5 (VE~/%E,-8pI 1SKX3JP7 mP>32&''67''67&'7> 2*4H =* %;;yV%',JugTT~AI0 (7kO)#F57R.547#"&54732>7M-9/=1CC':L#9 (H+% 1,RTyX_\5'(/#2=*,  '3OW7UP267#"."'>32*Y1cn!A'%1N .'(2%0o<>I>6P'#"&'7632.'&'&'67'>\=][Y3 C<+ #4'p&?'X3_'EaB #b0S65 ?$ee_m) 7=ao-%&''7#52672>54'7#"&547 -&82/&0".#@[:0 (L`}>GTΉ|46tb725#-=7$1E;aZM^-U5;7 Ke "&54632654'7'67&''7&0Qr6fua 3S7+.Eq2n lN  fh$$.(>=[=78"&54732>767'672CF%5?,G;3I*18J.)>@(/' ,!*T:ӛ%7 7"&54>732632'>54#"-;Xmf 5c?G$%#3mB4)= b 0#_!( F 78.547376?'>'3JN'?CJ3?:B74.3_:?&30&NP&@8 "SK^78J2'54#"#"54326,8*-&B1$@&7-".7$EM7 dB2>7.'#"54>7#"5467'632>S.@` 9#5%"84 ~0" !"  $4:A({>3 *")$'/;_W_(bV\$%4H &! *# %I$% ,$ 7R?P 2#"&543254&#"pOK;5M6-O."-PD57#".'&'76--%5 ] (/<"l/'5 1LPKK19WDQ [J/g -ed78 ",52.'#"&54632>4#"%"327&$V_M+*1>TiE#+Y,=RX/M07& % hA7]C/!=uc";V38(-$ 5 -' P 3LXu 'x7P 462&#"6"3277>BM/ApC1~!Ȁm } 7k^>53#"&54747.1:6#1@,Ly6W37W?:X.kH$ /KsID78]'654#"'67632]1-(_D3,Qr-D64=EP<27# 7>77%)!5!+&7WL H[7P2'67654'"#"'732<.$    v XTP+# 0 - 6 7P9>32'>7#"54>7&#"#"'732632 LL6f* &0 O8, & Y " Y V$. $ go 5  ,  $   5 0 7Z>3267.#"7z$+)"h4WN,?98!!$&)M*g(P+7# 7>7'>7&(!5"*%%)!5!+&7XL G\WL H[7#, %>7'>7'>7y%)!5$($&(!5"*%%)!5!+&7T K QYXL G\WL H[7 2#"&546}!/*#-),".,! .n) 9`$&*-24679:;<=DIJMPQSUVWXYZ[\]  !"#$%&+-/389:;<=>?@2  ; Q Z [ \ ] d e f g  $$$$&$*$,$2$4$6$7$9$:$;$<$=$D$F$G$H$I$J$P$Q$R$S$T$U$V$W$X$Y$Z$\$]$m$}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$ $!$"$#$$$%$&$+$-$/$1$3$8$9$:$;$<$=$>$?$@$ ;$ Q$ Z$ [$ \$ ]$ d$ e$ f$ g$ $ $ $ $ $ $ $$$$%%%%$%&%*%,%2%4%6%7%9%:%;%<%=%D%I%J%M%P%Q%R%S%U%V%W%X%Y%Z%[%\%]%m%}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%% %!%"%#%$%%%&%+%-%/%1%3%8%9%:%;%<%=%>%?%@% ;% Q% Z% [% \% ]% d% e% f% g% % % % % % % %%%%&&&$&&&*&,&2&4&6&7&9&:&;&<&=&D&I&J&M&P&Q&R&S&U&V&W&X&Y&Z&[&\&]&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&& &!&"&#&$&%&&&+&-&/&1&3&8&9&:&;&<&=&>&?&@& ;& Q& Z& [& \& ]& d& e& f& g& & & & & & &&&&'''$'&'*','-'2'4'6'7'9':';'<'='D'F'G'H'I'J'M'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'}''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''' '!'"'#'$'%'&'+'-'/'1'3'8'9':';'<'='>'?'@' ;' Q' Z' [' \' ]' d' e' f' g' ' ' ' ' ' ''''($(&(*(,(-(2(4(6(7(9(:(;(<(=(D(F(G(H(I(J(M(P(Q(R(S(T(U(V(W(X(Y(Z([(\(]((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( (((((((((((( (!("(#($(%(&(+(-(/(1(3(8(9(:(;(<(=(>(?(@( ;( Q( Z( [( \( ]( d( e( f( g( ( (((())))$)&)*),)-)2)4)6)9):);)<)=)D)F)G)H)I)J)M)P)Q)R)S)T)U)V)W)X)Y)Z)[)\)])m)}))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))) )!)")#)%)+)-)/)1)3)8)9):);)<)=)>)?)@) ;) Q) Z) [) \) ]) e) g) ) ) ) ))))***$*&***,*2*4*6*7*9*:*;*<*=*D*I*J*M*P*Q*R*S*U*V*W*X*Y*Z*[*\*]*}*********************************************************** ************ *!*"*#*$*%*&*+*-*/*1*3*8*9*:*;*<*=*>*?*@* ;* Q* Z* [* \* ]* d* e* f* g* * * * * * ****,$,&,*,,,2,4,6,7,9,:,;,<,=,D,F,G,H,I,J,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,!,",#,$,%,&,+,-,/,1,3,8,9,:,;,<,=,>,?,@, ;, Q, Z, [, \, ], d, e, f, g, , ,,,,-$-&-*-,-2-4-6-9-:-;-<-=-D-F-G-H-J-M-P-Q-R-S-T-U-V-X-Y-Z-[-\-]----------------------------------------------------------------------- ------------ -!-"-#-+---/-1-3-8-9-:-;-<-=->-?-@- ;- Q- Z- [- \- ]- - ....&.*.,.2.4.6.D.F.G.H.I.J.M.P.Q.R.S.T.U.V.W.X.Y.Z.[.\.].m.}............................................................ ............ .!.".#.%.+.-./.1.3.9.<.>.@. ;. Q. Z. [. \. ]. e. g. . . . . . ....////&/*/,/2/4/6/7/9/:/</D/F/G/H/I/J/M/P/Q/R/T/U/V/W/X/Y/Z/\/]/m/}///////////////////////////////////////////////////////////// //////////// /!/"/#/$/%/&/+/-///1/3/8/9/:/</>/@/ ;/ Z/ [/ \/ ]/ d/ e/ f/ g/ / / / / / / ////222$2,2627292:2;2<2=2D2J2P2Q2S2U2X2]2}222222222222222222222222222222222222 222 2"2$2&2+2-2/2123282:2;2<2=2>2?2@2 ;2 Q2 Z2 \2 d2 f2 2 2 2 2 3333$3&3*3,3-32343637393:3;3<3=3D3F3G3H3J3P3Q3R3S3T3U3V3X3[3]3m3}333333333333333333333333333333333333333333333333333333333333333333333 333333333333 3!3"3#3$3&3+3-3/3133383:3;3<3=3>3?3@3 ;3 Q3 Z3 [3 \3 ]3 d3 f3 3 3 3 3 3 444$4,4647494:4;4<4=4D4J4P4Q4S4U4X4]4}444444444444444444444444444444444444 444 4"4$4&4+4-4/4143484:4;4<4=4>4?4@4 ;4 Q4 Z4 \4 d4 f4 4 4 4 4 5$5&5*5,52545657595:5;5<5=5D5F5G5H5J5M5P5Q5R5S5T5U5V5X5Y5Z5\5]55555555555555555555555555555555555555555555555555555555555555555555555 555555555555 5!5"5#5$5&5+5-5/515358595:5;5<5=5>5?5@5 ;5 Q5 Z5 [5 \5 ]5 d5 f5 5 6666$6&6*6,62646667696:6;6<6=6I6M6P6Q6R6S6U6W6X6Y6Z6[6\6]6m6}6666666666666666666666666666666666666666666666 66666666666 6"6$6%6&6+6-6/616368696:6;6<6=6>6?6@6 ;6 Q6 Z6 \6 d6 e6 f6 g6 6 6 6 6 6 6 66667777$7&7*7,7-727476797:7;7<7=7D7F7G7H7I7J7P7Q7R7S7T7U7V7W7X7Y7Z7[7\7]7m7}77777777777777777777777777777777777777777777777777777777777777777777777 777777777777 7!7"7#7%7+7-7/717378797:7;7<7=7>7?7@7 ;7 Q7 Z7 [7 \7 ]7 e7 g7 7 7 7 77779999$9&9*9,9-9294969;9=9D9F9G9H9I9J9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9m9}9999999999999999999999999999999999999999999999999999999999999999999999 999999999999 9!9"9#9%9+9-9/9193999;9<9=9>9?9@9 ;9 Q9 Z9 [9 \9 ]9 e9 g9 9 9 9999::::$:&:*:,:-:2:4:6:;:=:D:F:G:H:I:J:P:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:m:}:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::: :!:":#:%:+:-:/:1:3:9:;:<:=:>:?:@: ;: Q: Z: [: \: ]: e: g: : : ::::;;;;&;*;,;2;4;6;D;F;G;H;I;J;M;P;Q;R;S;T;U;V;W;X;Y;Z;[;\;];m;};;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;; ;!;";#;%;+;-;/;1;3;9;<;>;@; ;; Q; Z; [; \; ]; e; g; ; ; ; ; ; ;;;;<<<<$<&<*<,<-<2<4<6<;<=<D<F<G<H<I<J<P<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<m<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<< <!<"<#<%<+<-</<1<3<9<;<<<=<><?<@< ;< Q< Z< [< \< ]< e< g< < < <<<<====&=*=,=2=4=6=D=F=G=H=I=J=M=P=Q=R=S=T=U=V=W=X=Y=Z=[=\=]=m=}============================================================ ============ =!="=#=%=+=-=/=1=3=9=<=>=@= ;= Q= Z= [= \= ]= e= g= = = = = = ====DDDDDDFDGDIDJDPDQDRDTDUDVDWDXDYDZD[D\D]DmD}DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDD!D#D%D+D-D/D1D3D9D<D>D@D2D D D [D ]D eD gD D D D D D DDDDDEEEMEPEQEUEXEYEZE[E\E]EEEEEEEEEE EE+E-E/E1E3E9E<E>E@E2E E E E FFFPFQFUFXF[F]FFFFFFFF FF+F-F/F1F3F<F>F@F2F F F GDGHGJGPGQGSGUGVGXG]GGGGGGGGGGGGGGGGGGGGGGGGGGGG GGG!G#G+G-G/G1G3G<G>G@G2G QG [G ]HHHHDHIHJHMHPHQHSHUHVHWHXHYHZH[H\H]HmHHHHHHHHHHHHHHHHHHHHHHH HHH!H#H%H+H-H/H1H3H9H<H>H@H2H H QH [H ]H eH gH H H H H HHHHHIIIIDIFIGIHIJIPIQIRITIUIVIXI[I]ImI}IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIII!I#I+I-I/I1I3I<I>I@I2I I [I ]I I JJJJFJGJHJRJTJmJ}JJJJJJJJJJJJJJJJJJJJJJJ J J J J J KKKKFKGKHKMKPKQKRKSKTKUKVKXKYKZK[K\K]KmK}KKKKKKKKKKKKKKKKKKKKKKKKKKKK KKKKKKK!K#K+K-K/K1K3K9K<K>K@K2K K QK [K ]K K K K K K NNNNDNFNGNHNJNPNQNRNSNTNUNVNXNYNZN\N]NmN}NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNN!N#N+N-N/N1N3N9N<N>N@N2N N QN [N ]N N N N N N PPPPFPGPHPMPPPQPRPSPTPUPVPXPYPZP[P\P]PmP}PPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPP!P#P+P-P/P1P3P9P<P>P@P2P P QP [P ]P P P P P P QQQQFQGQHQMQPQQQRQSQTQUQVQXQYQZQ[Q\Q]QmQ}QQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQ!Q#Q+Q-Q/Q1Q3Q9Q<Q>Q@Q2Q Q QQ [Q ]Q Q Q Q Q Q RRRRDRIRJRMRPRQRSRURVRWRXRYRZR[R\R]RmRRRRRRRRRRRRRRRRRRRRRRR RRR!R#R%R+R-R/R1R3R9R<R>R@R2R R QR [R ]R eR gR R R R R RRRRRSSSMSPSQSUSXSYSZS[S\S]SSSSSSSSSS SS+S-S/S1S3S9S<S>S@S2S S S S UUUUDUFUGUHUJUPUQURUTUVUXU[U]UmUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUUUUU!U#U+U-U/U1U3U<U>U@U2U U [U ]U VVVVDVFVIVJVMVPVQVRVSVUVVVWVXVYVZV[V\V]VmV}VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVV!V#V%V+V-V/V1V3V9V<V>V@V2V V QV [V ]V eV gV V V V V V VVVVVWDWFWGWHWIWJWPWQWRWTWUWVWWW[W]W}WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWW!W#W%W<W>W@W2W W W [W ]W eW gW WWWWWXXXXFXGXHXRXTXmX}XXXXXXXXXXXXXXXXXXXXXXX X X X X X YYYYDYFYGYHYIYJYMYPYQYRYSYTYUYVYWYXY[Y]YmY}YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY YYYYYYY!Y#Y%Y+Y-Y/Y1Y3Y<Y>Y@Y2Y Y Y QY [Y ]Y eY gY Y Y Y Y YYYYYZZZZDZFZGZHZIZJZMZPZQZRZSZTZUZVZWZXZ[Z]ZmZ}ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZ!Z#Z%Z+Z-Z/Z1Z3Z<Z>Z@Z2Z Z Z QZ [Z ]Z eZ gZ Z Z Z Z ZZZZZ[[[[D[F[G[H[J[P[Q[R[S[T[U[V[X[Y[Z[\[][m[}[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[![#[+[-[/[1[3[9[<[>[@[2[ [ Q[ [[ ][ [ [ [ [ [ \\\\D\F\G\H\I\J\M\P\Q\R\S\T\U\V\W\X\[\]\m\}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\!\#\%\+\-\/\1\3\<\>\@\2\ \ \ Q\ [\ ]\ e\ g\ \ \ \ \ \\\\\]]]]D]F]G]H]I]J]M]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]m]}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]!]#]%]+]-]/]1]3]9]<]>]@]2] ] ] Q] [] ]] e] g] ] ] ] ] ] ]]]]]m$m&m*m2m4m6m7m9m:m;m<m=mDmFmGmHmImJmMmPmQmRmSmTmUmWmXmYmZm[m\m]mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm mmmmmmmmmmm m"m$m%m&m+m-m/m3m8m9m:m;m<m=m>m?m@m2m m ;m Qm Zm \m dm em fm gm m mmmmm}$}&}*}-}2}4}6}7}9}:};}<}=}D}I}J}M}P}Q}S}U}V}W}X}Y}Z}[}\}]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}} }!}"}#}$}%}&}+}-}/}3}8}9}:};}<}=}>}?}@}2} } ;} Q} Z} [} \} ]} d} e} f} g} } }}}}}&*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DFGHIJPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DFGHIJPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DFGHIJPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DFGHIJPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DIJMPQRSUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f $&*,-246;=DFGHIJPQRSTUVWXYZ[\]m}  !"#%+-/139;<=>?@ ; Q Z [ \ ] e g  $&*,24679:;<=DIJMPQRSUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g PQUX[] +-/13<>@2 DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g FGHMPQRSTUVXYZ[\]m} !#+-/139<>@2  Q [ ]  DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g FGHRTm}   FGHRTm}   FGHRTm}   FGHRTm}   DFGHIJMPQRSTUVWX[]m} !#%+-/13<>@2   Q [ ] e g  DFGHIJMPQRSTUVWX[]m} !#%+-/13<>@2   Q [ ] e g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]m}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  )H 7DFGIJPQRTUVWXYZ[\]m} !#%+-/139<>@2   [ ] e g  &*,24679:;<=DFGHIJPQRSTUVWXYZ\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DFGIJPQRTUVWXYZ[\] !#%+-/139<>@2   [ ] e g $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g PQUX[] +-/13<>@2$&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g PQUX[] +-/13<>@2 $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g PQUX[] +-/13<>@2$&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g PQUX[] +-/13<>@2 $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g FGHRTm}   $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g FGHRTm}   $&*,24679:;<=DIJMPQRSUVWXYZ[\]}  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g FGHRTm}   &*,246DFGHIJMPQRSTUVWXYZ[\]m}  !"#%+-/139<>@ ; Q Z [ \ ] e g  DFGHJPQRSTUVXYZ\]m} !#+-/139<>@2  Q [ ]  &*,24679:<DFGHIJMPQRTUVWXYZ\]m}  !"#$%&+-/1389:<>@ ; Z [ \ ] d e f g  &*,24679:<DFGHIJMPQRTUVWXYZ\]m}  !"#$%&+-/1389:<>@ ; Z [ \ ] d e f g  &*,24679:<DFGHIJMPQRTUVWXYZ\]m}  !"#$%&+-/1389:<>@ ; Z [ \ ] d e f g  &*,24679:<DFGHIJMPQRTUVWXYZ\]m}  !"#$%&+-/1389:<>@ ; Z [ \ ] d e f g       FGHMPQRSTUVXYZ[\]m} !#+-/139<>@2  Q [ ]      FGHMPQRSTUVXYZ[\]m} !#+-/139<>@2  Q [ ]          F G H M P Q R S T U V X Y Z [ \ ] m }                                    ! # + - / 1 3 9 < > @ 2  Q [ ]      $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f     DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g     $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f     DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g     $,679:;<=DJPQSUX]}  "$&+-/138:;<=>?@ ; Q Z \ d f     DIJMPQSUVWXYZ[\]m !#%+-/139<>@2  Q [ ] e g     $&*,-24679:;<=DFGHIJMPQRSTUVWXYZ[\]  !"#$%&+-/1389:;<=>?@ ; Q Z [ \ ] d e f g  DIJMPQSUVWXYZ[\] !#%+-/139<>@2  Q [ ] e g $&*,24679:;<=DFGHJMPQRSTUVXYZ\]  !"#$&+-/1389:;<=>?@ ; Q Z [ \ ] d f  DFGHJPQRTVX[]m !#+-/13<>@2  [ ] $&*,24679:;<=IMPQRSUWXYZ[\]m}  "$%&+-/1389:;<=>?@ ; Q Z \ d e f g       DFIJMPQRSUVWXYZ[\]m} !#%+-/139<>@2  Q [ ] e g          $ & * , 2 4 6 7 9 : ; < = I M P Q R S U W X Y Z [ \ ] m }                                                            " $ % & + - / 1 3 8 9 : ; < = > ? @ ; Q Z \ d e f g           !!!!D!F!I!J!M!P!Q!R!S!U!V!W!X!Y!Z![!\!]!m!}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!#!%!+!-!/!1!3!9!<!>!@!2! ! Q! [! ]! e! g! ! ! ! ! ! !!!!!""""$"&"*","2"4"6"7"9":";"<"="I"M"P"Q"R"S"U"W"X"Y"Z"["\"]"m"}"""""""""""""""""""""""""""""""""""""""""""""" """"""""""" """$"%"&"+"-"/"1"3"8"9":";"<"=">"?"@" ;" Q" Z" \" d" e" f" g" " " " " " " """"####D#F#I#J#M#P#Q#R#S#U#V#W#X#Y#Z#[#\#]#m#}################################ #######!###%#+#-#/#1#3#9#<#>#@#2# # Q# [# ]# e# g# # # # # # #####$$$$$$&$*$,$-$2$4$6$9$:$;$<$=$D$F$G$H$I$J$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$m$}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$ $!$"$#$%$+$-$/$1$3$8$9$:$;$<$=$>$?$@$ ;$ Q$ Z$ [$ \$ ]$ e$ g$ $ $ $ $$$$%D%F%G%H%I%J%P%Q%R%T%U%V%W%[%]%}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%!%#%%%<%>%@%2% % % [% ]% e% g% %%%%%&$&&&*&,&-&2&4&6&9&:&;&<&=&D&F&G&H&I&J&P&Q&R&S&T&U&V&W&X&Y&Z&[&\&]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&& &!&"&#&%&+&-&/&1&3&8&9&:&;&<&=&>&?&@& ;& Q& Z& [& \& ]& e& g& & &&&&+F+G+H+R+T+++++++++++++++++++++++ ----F-G-H-R-T-m-}----------------------- - - - - - ////F/G/H/R/T/m/}/////////////////////// / / / / / 1F1G1H1R1T11111111111111111111111 3333F3G3H3R3T3m3}33333333333333333333333 3 3 3 3 3 8888$8&8*8,8-8284868;8=8D8F8G8H8I8J8P8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8m8}8888888888888888888888888888888888888888888888888888888888888888888888 888888888888 8!8"8#8%8+8-8/8183898;8<8=8>8?8@8 ;8 Q8 Z8 [8 \8 ]8 e8 g8 8 8 88889999D9F9G9H9I9J9M9P9Q9R9S9T9U9V9W9X9[9]9m9}999999999999999999999999999999999999999 9999999!9#9%9+9-9/91939<9>9@929 9 9 Q9 [9 ]9 e9 g9 9 9 9 9 99999::::$:&:*:,:-:2:4:6:;:=:D:F:G:H:I:J:P:Q:R:S:T:U:V:W:X:Y:Z:[:\:]:m:}:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::: :!:":#:%:+:-:/:1:3:9:;:<:=:>:?:@: ;: Q: Z: [: \: ]: e: g: : : ::::;;;;m;}; ; ; ; ; <<<<D<F<G<H<I<J<M<P<Q<R<S<T<U<V<W<X<Y<Z<[<\<]<m<}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<!<#<%<+<-</<1<3<9<<<><@<2< < < Q< [< ]< e< g< < < < < < <<<<<====m=}= = = = = >>>>D>F>G>H>I>J>M>P>Q>R>S>T>U>V>W>X>Y>Z>[>\>]>m>}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>!>#>%>+>->/>1>3>9><>>>@>2> > > Q> [> ]> e> g> > > > > > >>>>>????&?*?,?2?4?6?D?F?G?H?I?J?M?P?Q?R?S?T?U?V?W?X?Y?Z?[?\?]?m?}???????????????????????????????????????????????????????????? ???????????? ?!?"?#?%?+?-?/?1?3?9?<?>?@? ;? Q? Z? [? \? ]? e? g? ? ? ? ? ? ????@@@@D@F@G@H@I@J@M@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@m@}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@!@#@%@+@-@/@1@3@9@<@>@@@2@ @ @ Q@ [@ ]@ e@ g@ @ @ @ @ @ @@@@@y$y&y*y,y2y4y6y7y9y:y;y<y=yDyIyJyMyPyQyRySyUyVyWyXyYyZy[y\y]yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy yyyyyyyyyyyy y!y"y#y$y%y&y+y-y/y1y3y8y9y:y;y<y=y>y?y@y ;y Qy Zy [y \y ]y dy ey fy gy y yyyy$&*,-24679:;<=DFGHJPQRSTUVX[]m}  !"#$&+-/138:;<=>?@ ; Q Z [ \ ] d f      2222m2}2 2 2 2 2 jkjwj~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkksks~sssssssssssssssssssssssssssssssssssssssssssssssssssssukuwu~uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuzkzwz~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz~~k~kw~kw~kw~    $ & * , 2 4 6 7 9 : ; < = D I J M P Q R S U V W X Y Z [ \ ] m }                ! " # $ % & + - / 1 3 8 9 : ; < = > ? @ ; Q Z [ \ ] d e f g         $ & * , - 2 4 6 7 9 : ; < = D F G H I J M P Q R S T U V W X Y Z [ \ ]                                                                                    ! " # $ % & + - / 1 3 8 9 : ; < = > ? @  ;  Q  Z  [  \  ]  d  e  f  g       D H J P Q S U V X ]                               ! # + - / 1 3 < > @ 2  Q  [  ]    $ & * , - 2 4 6 9 : ; < = D F G H I J M P Q R S T U V W X Y Z [ \ ] m }                                                                                    ! " # % + - / 1 3 8 9 : ; < = > ? @  ;  Q  Z  [  \  ]  e  g              D F G H J P Q R T U V X [ ] m }                                              ! # + - / 1 3 < > @ 2    [  ]        F G H M P Q R S T U V X Y Z [ \ ] m }                                   ! # + - / 1 3 9 < > @ 2    Q  [  ]         ; ; ; ;F ;G ;H ;M ;P ;Q ;R ;S ;T ;U ;V ;X ;Y ;Z ;[ ;\ ;] ;m ;} ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;! ;# ;+ ;- ;/ ;1 ;3 ;9 ;< ;> ;@ ;2 ;  ; Q ; [ ; ] ; ; ; ; ;  ;  P P P P$ P& P* P, P- P2 P4 P6 P7 P9 P: P; P< P= PD PF PG PH PJ PP PQ PR PS PT PU PV PX P[ P] Pm P} P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P! P" P# P$ P& P+ P- P/ P1 P3 P8 P: P; P< P= P> P? P@ P ; P Q P Z P [ P \ P ] P d P f P P P P P  P  Q Q QM QP QQ QU QX QY QZ Q[ Q\ Q] Q Q Q Q Q Q Q Q Q Q Q Q+ Q- Q/ Q1 Q3 Q9 Q< Q> Q@ Q2 Q Q Q Q Z Z Z Z$ Z& Z* Z, Z2 Z4 Z6 Z7 Z9 Z: Z; Z< Z= ZI ZM ZP ZQ ZR ZS ZU ZW ZX ZY ZZ Z[ Z\ Z] Zm Z} Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z" Z$ Z% Z& Z+ Z- Z/ Z1 Z3 Z8 Z9 Z: Z; Z< Z= Z> Z? Z@ Z ; Z Q Z Z Z \ Z d Z e Z f Z g Z Z Z Z Z Z  Z  Z Z Z Z [ [ [ [D [F [I [J [M [P [Q [R [S [U [V [W [X [Y [Z [[ [\ [] [m [} [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [! [# [% [+ [- [/ [1 [3 [9 [< [> [@ [2 [  [ Q [ [ [ ] [ e [ g [ [ [ [ [  [  [ [ [ [ [ \ \ \ \$ \& \* \, \2 \4 \6 \7 \9 \: \; \< \= \I \M \P \Q \R \S \U \W \X \Y \Z \[ \\ \] \m \} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \" \$ \% \& \+ \- \/ \1 \3 \8 \9 \: \; \< \= \> \? \@ \ ; \ Q \ Z \ \ \ d \ e \ f \ g \ \ \ \ \ \  \  \ \ \ \ ] ] ] ]D ]F ]I ]J ]M ]P ]Q ]R ]S ]U ]V ]W ]X ]Y ]Z ][ ]\ ]] ]m ]} ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]! ]# ]% ]+ ]- ]/ ]1 ]3 ]9 ]< ]> ]@ ]2 ]  ] Q ] [ ] ] ] e ] g ] ] ] ] ]  ]  ] ] ] ] ] d d d d$ d& d* d, d- d2 d4 d6 d9 d: d; d< d= dD dF dG dH dI dJ dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] dm d} d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d! d" d# d% d+ d- d/ d1 d3 d8 d9 d: d; d< d= d> d? d@ d ; d Q d Z d [ d \ d ] d e d g d d d  d  d d d d eD eF eG eH eI eJ eP eQ eR eT eU eV eW e[ e] e} e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e! e# e% e< e> e@ e2 e  e  e [ e ] e e e g e  e e e e e f f f f$ f& f* f, f- f2 f4 f6 f9 f: f; f< f= fD fF fG fH fI fJ fP fQ fR fS fT fU fV fW fX fY fZ f[ f\ f] fm f} f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f! f" f# f% f+ f- f/ f1 f3 f8 f9 f: f; f< f= f> f? f@ f ; f Q f Z f [ f \ f ] f e f g f f f  f  f f f f gD gF gG gH gI gJ gP gQ gR gT gU gV gW g[ g] g} g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g! g# g% g< g> g@ g2 g  g  g [ g ] g e g g g  g g g g g $ & * , - 2 4 6 7 9 : ; < = D F G H I J M P Q R S T U V W X Y Z [ \ ]                ! " # $ % & + - / 1 3 8 9 : ; < = > ? @ ; Q Z [ \ ] d e f g        $ & * , - 2 4 6 ; = D F G H I J P Q R S T U V W X Y Z [ \ ] m }                ! " # % + - / 1 3 9 ; < = > ? @ ; Q Z [ \ ] e g          D F G H I J M P Q R S T U V W X [ ] m }          ! # % + - / 1 3 < > @ 2   Q [ ] e g        $ & * - 2 4 6 ; = D F G H J P Q R S T U V X ]                ! " # + - / 3 ; < = > ? @ 2 ; Q Z [ \ ] $ & * 2 4 6 9 : < D F G H J P Q R S T U V X Y Z [ \ ]                ! " # + - / 3 8 9 : < > @ 2 ; Q Z [ \ ] & * 2 4 6 7 9 : ; < = D F G H I J P Q R S T U V W X Y Z [ \ ]                ! " # $ % & + - / 3 8 9 : ; < = > ? @ 2  ; Q Z [ \ ] d e f g      $ & * - 2 4 6 ; = D F G H J P Q R S T U V X ]                ! " # + - / 3 ; < = > ? @ 2 ; Q Z [ \ ] & * 2 4 6 7 9 : ; < = D F G H I J P Q R S T U V W X Y Z [ \ ]                ! " # $ % & + - / 3 8 9 : ; < = > ? @ 2  ; Q Z [ \ ] d e f g      $ & * 2 4 6 7 9 : ; < = D F G H I J M P Q R S T U W X Y Z [ \ ]                                                                          " $ % & + - / 3 8 9 : ; < = > ? @ 2    ;  Q  Z  \  d  e  f  g        $ & * - 2 4 6 7 9 : ; < = D I J M P Q S U V W X Y Z [ \ ]                                                      ! " # $ % & + - / 3 8 9 : ; < = > ? @ 2    ;  Q  Z  [  \  ]  d  e  f  g       DFGHJPQRTUVX[]m} !#+-/13<>@2  [ ]  0FE%N   +e  -$E   t     J t 6   V   H      f H     !T" r$& :'$*j-Copyleft 2002, 2003, 2005, 2008, 2009, 2010 Free Software Foundation.Copyleft 2002, 2003, 2005, 2008, 2009, 2010 Free Software Foundation.FreeSansFreeSansMediumMediumFontForge 2.0 : Free Sans : 19-9-2010FontForge 2.0 : Free Sans : 19-9-2010Free SansFree SansVersion $Revision: 1.344 $ Version $Revision: 1.344 $ FreeSansFreeSansGNUGNUhttps://savannah.gnu.org/projects/freefont/https://savannah.gnu.org/projects/freefont/This computer font is part of GNU FreeFont. It is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.This computer font is part of GNU FreeFont. It is free software: you can 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, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlva?@O<V9NormalNormalNormalNavadnoNormlne1KG=K9NormalNormalOdmiana ZwykBaNormalnormalusisvidjsMediomenengahNormlMittelNormalNormaaliGemiddeldnormaloby ejn=>@<0;5=ArruntaP2  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ softhyphenmicromiddotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexTcedillatcedillaTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018F Epsilonlatinuni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019EObarOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6Yoghuni01B8uni01B9uni01BAuni01BBuni01BEwynnuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFicaronuni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9Oogonekoogonekuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5Wynnuni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208 idblgraveuni020Aiinvertedbreveuni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0224uni0225 A_dotaccent a_dotaccentuni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233dotlessjaturnascript ascriptturnbhookcturnccurldtaildhookerevschwa schwahook epsilonlatinepsilonlatinrevepsilonlatinrevhookepsilonlatinrevclosed jdotlessbarghookgscript Gsmallcap gammalatinramshornhturnhhookhenghookibar iotalatin Ismallcap lmidtildelbeltlrthooklezhmturnedmlonglegturnedmhook nhookleftnrthook Nsmallcapobar OEsmallcap omegaclosedphilatinrturnrlonglegturned rhookturnedrlonglegrhook rfishhook rfishhookrev Rsmallcap Rsmallcapinvshookeshdotlessjstrokehook eshshortreveshcurltturntrthookubar upsilonlatinvhookvturnwturnyturn Ysmallcapzrthookzcurlezhezhcurl glottalstopglottalstoprevinvglottalstopinvcstretch bilabialclick Bsmallcap epsilonclosed Gsmallhook Hsmallcap jcrosstailkturn Lsmallcapqhookglottalstopbarglottalstopbarrevdzaltonedezhdzcurltsteshtccurluni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFhsuper hhooksuperjsuperrsuper rturnsuperrturnrthooksuper Rturnsuperwsuperysuperprimemod dblprimemod quoteleftmod apostrophe apostropherev ringhalfright ringhalfleftglottalstopmodglottalstopreversedmodfrontedbackedraisedloweredverticallinemodmacronmodifier acutemodifier gravemodifierverticallinelowmod macronlowmodgravesubacutesubcolontriangularmodcolontriangularhalfmodringhalfrightcenteredringhalfleftcentered tackupmid tackdownmidplusmodminusmoduni02DEuni02DF gammasuperlsuperssuperxsuperglottalrevsuper toneextrahightonehightonemidtonelow toneextralowuni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecomb circumflexcmb tildecomb macroncmb overlinecmbbrevecmb dotaccentcmb diaeresiscomb hookabovecombringcmbhungarumlautcmbcaroncmbverticallineabovecmbdblverticallineabovecmb gravedblnospcandrabinducmbbreveinvertedcmbcommaturnedabovecmb psilicomb dasiacombcommaaboverightcmb gravebelowcmb acutebelowcmblefttackbelowcmbuni0319uni031Ahorncmbringlefthalfsubnospuptackbelowcmbuni031Euni031F minusbelowcmbhookpalatalizedbelowcmbhookretroflexbelowcmb dotbelowcombdieresisbelowcmb ringbelowcmb commasubnosp cedillacmb ogonekcmblinevertsubnospbridgebelowcmbdblarchinvertedbelowcmb caronbelowcmbcircumflexbelowcmb brevebelowcmbbreveinvertedbelowcmb tildebelowcmbmacronbelowcmb lowlinecmb dbllowlinecmbtildeoverlaycmbstrokeshortoverlaycmbstrokelongoverlaycmbsolidusshortoverlaycmbsoliduslongoverlaycmbringrighthalfsubnospbridgeinvertedbelowcmbsquarebelowcmbseagullbelowcmb xabovecmbtildeverticalcmbdbloverlinecmbuni0340uni0341uni0342uni0343diaeresistonosnospuni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375 ypogegrammeniuni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonostheta1 UpsilonhookUpsilonhooktonosUpsilonhookdiaeresisphi1 pisymbolgreekuni03D7uni03F0rhosymbolgreekuni03f4uni03F5Iecyrillic_grave Iocyrillic Djecyrillic Gjecyrillic Ecyrillic Dzecyrillic Icyrillic Yicyrillic Jecyrillic Ljecyrillic Njecyrillic Tshecyrillic KjecyrillicIicyrillic_graveUshortcyrillic Dzhecyrillic Acyrillic Becyrillic Vecyrillic Gecyrillic Decyrillic Iecyrillic Zhecyrillic Zecyrillic IicyrillicIishortcyrillic Kacyrillic Elcyrillic Emcyrillic Encyrillic Ocyrillic Pecyrillic Ercyrillic Escyrillic Tecyrillic Ucyrillic Efcyrillic Khacyrillic Tsecyrillic Checyrillic Shacyrillic ShchacyrillicHardsigncyrillic YericyrillicSoftsigncyrillicEreversedcyrillic IUcyrillic IAcyrillic acyrillic becyrillic vecyrillic gecyrillic decyrillic iecyrillic zhecyrillic zecyrillic iicyrilliciishortcyrillic kacyrillic elcyrillic emcyrillic encyrillic ocyrillic pecyrillic ercyrillic escyrillic tecyrillic ucyrillic efcyrillic khacyrillic tsecyrillic checyrillic shacyrillic shchacyrillichardsigncyrillic yericyrillicsoftsigncyrillicereversedcyrillic iucyrillic iacyrilliciecyrillic_grave iocyrillic djecyrillic gjecyrillic ecyrillic dzecyrillic icyrillic yicyrillic jecyrillic ljecyrillic njecyrillic tshecyrillic kjecyrilliciicyrillic_graveushortcyrillic dzhecyrillic Omegacyrillic omegacyrillicuni0470uni0471 Fitacyrillic fitacyrillicOmegatitlocyrillicomegatitlocyrillic Otcyrillic otcyrillicthousandcyrillictitlocyrilliccmbpalatalizationcyrilliccmbdasiapneumatacyrilliccmbpsilipneumatacyrilliccmbuni0487uni0488uni0489uni048auni048buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04d9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFDzeabkhasiancyrillicuni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04f6uni04f7uni04F8uni04F9uni0510uni0511uni0512uni0513uni051auni051buni051cuni051duni051euni051funi0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564 echarmenianuni0566uni0567uni0568uni0569uni056A iniarmenianuni056C xeharmenianuni056Euni056Funi0570uni0571uni0572uni0573 menarmenianuni0575 nowarmenianuni0577uni0578uni0579uni057Auni057Buni057Cuni057D vewarmenianuni057Funi0580uni0581 yiwnarmenianuni0583uni0584uni0585uni0586echyiwnarmenianuni0589uni058A afii57799 afii57801 afii57800 afii57802 hiriqhebrew tserehebrew segolhebrew patahhebrew qamatshebrew holamhebrew afii57796 dageshhebrew afii57839 afii57645 rafehebrew afii57842 shindothebrew sindothebrewsofpasuqhebrewupperdothebrew alefhebrew bethebrew gimelhebrew dalethebrewhehebrew vavhebrew zayinhebrew hethebrew tethebrew yodhebrewfinalkafhebrew kafhebrew lamedhebrewfinalmemhebrew memhebrewfinalnunhebrew nunhebrew samekhhebrew ayinhebrew finalpehebrewpehebrew tsadifinal tsadihebrew qofhebrew reshhebrew shinhebrew tavhebrew vavvavhebrew vavyodhebrew yodyodhebrew gereshhebrewgershayimhebrewuni0700uni0701uni0702uni0703uni0704uni0705uni0706uni0707uni0708uni0709uni070Auni070Buni070Cuni070Duni070Funi0710uni0711uni0712uni0713uni0714uni0715uni0716uni0717uni0718uni0719uni071Auni071Buni071Cuni071Duni071Euni071Funi0720uni0721uni0722uni0723uni0724uni0725uni0726uni0727uni0728uni0729uni072Auni072Buni072Cuni0730uni0731uni0732uni0733uni0734uni0735uni0736uni0737uni0738uni0739uni073Auni073Buni073Cuni073Duni073Euni073Funi0740uni0741uni0742uni0743uni0744uni0745uni0746uni0747uni0748uni0749uni074Auni0900candrabindudeva anusvaradeva visargadevauni0904adevaaadevaidevaiidevaudevauudeva rvocalicdeva lvocalicdeva ecandradeva eshortdevaedevaaideva ocandradeva oshortdevaodevaaudevakadevakhadevagadevaghadevangadevacadevachadevajadevajhadevanyadevattadevatthadevaddadevaddhadevannadevatadevathadevadadevadhadevanadevannnadevapadevaphadevabadevabhadevamadevayadevaradevarradevaladevalladevallladevavadevashadevassadevasadevahadeva nuktadeva avagrahadevaaavowelsigndevaivowelsigndevaiivowelsigndevauvowelsigndevauuvowelsigndevarvocalicvowelsigndevarrvocalicvowelsigndevaecandravowelsigndevaeshortvowelsigndevaevowelsigndevaaivowelsigndevaocandravowelsigndevaoshortvowelsigndevaovowelsigndevaauvowelsigndeva viramadevauni094eomdeva udattadeva anudattadeva gravedeva acutedevauni0955qadevakhhadevaghhadevazadeva dddhadevarhadevafadevayyadeva rrvocalicdeva llvocalicdevalvocalicvowelsigndevauni0963uni0964dbldandazerodevaonedevatwodevauni0969uni096Auni096Bsixdevauni096D eightdevaninedevaabbreviationsigndevauni0971uni0972uni0979uni097auni097buni097cuni097duni097euni097fbn_candrabindu bn_anusvara bn_visargabn_abn_aabn_ibn_iibn_ubn_uubn_ribn_libn_ebn_aibn_obn_aubn_kabn_khabn_gabn_ghabn_ngabn_cabn_chabn_jabn_jhabn_nyabn_ttabn_tthabn_ddabn_ddhabn_nnabn_tabn_thabn_dabn_dhabn_nabn_pabn_phabn_babn_bhabn_mabn_yabn_rabn_labn_shabn_ssabn_sabn_habn_nukta bn_avagraha bn_aakaarbn_ikaar bn_iikaarbn_ukaar bn_uukaar bn_rikaar bn_rrikaarbn_ekaar bn_aikaarbn_okaar bn_aukaar bn_hasanta bn_half_ta bn_aumarkbn_rrabn_rhabn_yyabn_rribn_lli bn_likaar bn_llikaarbn_zerobn_onebn_twobn_threebn_fourbn_fivebn_sixbn_sevenbn_eightbn_nine bn_asamira bn_asamiba bn_rupeemark bn_rupeesign bn_currency1 bn_currency2 bn_currency3 bn_currency4bn_currencyless bn_currency16 bn_issharuni0A01 bindigurmukhiuni0A03 agurmukhi aagurmukhi igurmukhi iigurmukhi ugurmukhi uugurmukhi eegurmukhi aigurmukhi oogurmukhi augurmukhi kagurmukhi khagurmukhi gagurmukhi ghagurmukhi ngagurmukhi cagurmukhi chagurmukhi jagurmukhi jhagurmukhi nyagurmukhi ttagurmukhi tthagurmukhi ddagurmukhi ddhagurmukhi nnagurmukhi tagurmukhi thagurmukhi dagurmukhi dhagurmukhi nagurmukhi pagurmukhi phagurmukhi bagurmukhi bhagurmukhi magurmukhi yagurmukhi ragurmukhi lagurmukhiuni0A33 vagurmukhi shagurmukhi sagurmukhi hagurmukhi nuktagurmukhiaamatragurmukhiimatragurmukhiiimatragurmukhiumatragurmukhiuumatragurmukhieematragurmukhiaimatragurmukhioomatragurmukhiaumatragurmukhihalantgurmukhiuni0a51 khhagurmukhi ghhagurmukhi zagurmukhi rragurmukhi fagurmukhi zerogurmukhi onegurmukhi twogurmukhi threegurmukhi fourgurmukhi fivegurmukhi sixgurmukhi sevengurmukhi eightgurmukhi ninegurmukhi tippigurmukhi addakgurmukhi irigurmukhi uragurmukhiekonkargurmukhiuni0a75candrabindugujaratianusvaragujarativisargagujarati agujarati aagujarati igujarati iigujarati ugujarati uugujaratirvocalicgujaratiuni0a8cecandragujarati egujarati aigujaratiocandragujarati ogujarati augujarati kagujarati khagujarati gagujarati ghagujarati ngagujarati cagujarati chagujarati jagujarati jhagujarati nyagujarati ttagujarati tthagujarati ddagujarati ddhagujarati nnagujarati tagujarati thagujarati dagujarati dhagujarati nagujarati pagujarati phagujarati bagujarati bhagujarati magujarati yagujarati ragujarati lagujarati llagujarati vagujarati shagujarati ssagujarati sagujarati hagujarati nuktagujaratiuni0ABDaavowelsigngujaratiivowelsigngujaratiiivowelsigngujaratiuvowelsigngujaratiuuvowelsigngujaratiuni0AC3 guj_rrvocalicecandravowelsigngujaratievowelsigngujaratiaivowelsigngujaratiocandravowelsigngujaratiovowelsigngujaratiauvowelsigngujarativiramagujarati omgujaratirrvocalicgujaratiuni0ae1uni0ae2uni0ae3 zerogujarati onegujarati twogujarati threegujarati fourgujarati fivegujarati sixgujarati sevengujarati eightgujarati ninegujaratiuni0AF1uni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10f9uni10fbuni10fcuni13A0uni13A1uni13A2uni13A3uni13A4uni13A5uni13A6uni13A7uni13A8uni13A9uni13AAuni13ABuni13ACuni13ADuni13AEuni13AFuni13B0uni13B1uni13B2uni13B3uni13B4uni13B5uni13B6uni13B7uni13B8uni13B9uni13BAuni13BBuni13BCuni13BDuni13BEuni13BFuni13C0uni13C1uni13C2uni13C3uni13C4uni13C5uni13C6uni13C7uni13C8uni13C9uni13CAuni13CBuni13CCuni13CDuni13CEuni13CFuni13D0uni13D1uni13D2uni13D3uni13D4uni13D5uni13D6uni13D7uni13D8uni13D9uni13DAuni13DBuni13DCuni13DDuni13DEuni13DFuni13E0uni13E1uni13E2uni13E3uni13E4uni13E5uni13E6uni13E7uni13E8uni13E9uni13EAuni13EBuni13ECuni13EDuni13EEuni13EFuni13F0uni13F1uni13F2uni13F3uni13F4uni1401uni1402uni1403uni1404uni1405uni1406uni1407uni1408uni1409uni140Auni140Buni140Cuni140Duni140Euni140Funi1410uni1411uni1412uni1413uni1414uni1415uni1416uni1417uni1418uni1419uni141Auni141Buni141Cuni141Duni141Euni141Funi1420uni1421uni1422uni1423uni1424uni1425uni1426uni1427uni1428uni1429uni142Auni142Buni142Cuni142Duni142Euni142Funi1430uni1431uni1432uni1433uni1434uni1435uni1436uni1437uni1438uni1439uni143Auni143Buni143Cuni143Duni143Euni143Funi1440uni1441uni1442uni1443uni1444uni1445uni1446uni1447uni1448uni1449uni144Auni144Buni144Cuni144Duni144Euni144Funi1450uni1451uni1452uni1453uni1454uni1455uni1456uni1457uni1458uni1459uni145Auni145Buni145Cuni145Duni145Euni145Funi1460uni1461uni1462uni1463uni1464uni1465uni1466uni1467uni1468uni1469uni146Auni146Buni146Cuni146Duni146Euni146Funi1470uni1471uni1472uni1473uni1474uni1475uni1476uni1477uni1478uni1479uni147Auni147Buni147Cuni147Duni147Euni147Funi1480uni1481uni1482uni1483uni1484uni1485uni1486uni1487uni1488uni1489uni148Auni148Buni148Cuni148Duni148Euni148Funi1490uni1491uni1492uni1493uni1494uni1495uni1496uni1497uni1498uni1499uni149Auni149Buni149Cuni149Duni149Euni149Funi14A0uni14A1uni14A2uni14A3uni14A4uni14A5uni14A6uni14A7uni14A8uni14A9uni14AAuni14ABuni14ACuni14ADuni14AEuni14AFuni14B0uni14B1uni14B2uni14B3uni14B4uni14B5uni14B6uni14B7uni14B8uni14B9uni14BAuni14BBuni14BCuni14BDuni14BEuni14BFuni14C0uni14C1uni14C2uni14C3uni14C4uni14C5uni14C6uni14C7uni14C8uni14C9uni14CAuni14CBuni14CCuni14CDuni14CEuni14CFuni14D0uni14D1uni14D2uni14D3uni14D4uni14D5uni14D6uni14D7uni14D8uni14D9uni14DAuni14DBuni14DCuni14DDuni14DEuni14DFuni14E0uni14E1uni14E2uni14E3uni14E4uni14E5uni14E6uni14E7uni14E8uni14E9uni14EAuni14EBuni14ECuni14EDuni14EEuni14EFuni14F0uni14F1uni14F2uni14F3uni14F4uni14F5uni14F6uni14F7uni14F8uni14F9uni14FAuni14FBuni14FCuni14FDuni14FEuni14FFuni1500uni1501uni1502uni1503uni1504uni1505uni1506uni1507uni1508uni1509uni150Auni150Buni150Cuni150Duni150Euni150Funi1510uni1511uni1512uni1513uni1514uni1515uni1516uni1517uni1518uni1519uni151Auni151Buni151Cuni151Duni151Euni151Funi1520uni1521uni1522uni1523uni1524uni1525uni1526uni1527uni1528uni1529uni152Auni152Buni152Cuni152Duni152Euni152Funi1530uni1531uni1532uni1533uni1534uni1535uni1536uni1537uni1538uni1539uni153Auni153Buni153Cuni153Duni153Euni153Funi1540uni1541uni1542uni1543uni1544uni1545uni1546uni1547uni1548uni1549uni154Auni154Buni154Cuni154Duni154Euni154Funi1550uni1551uni1552uni1553uni1554uni1555uni1556uni1557uni1558uni1559uni155Auni155Buni155Cuni155Duni155Euni155Funi1560uni1561uni1562uni1563uni1564uni1565uni1566uni1567uni1568uni1569uni156Auni156Buni156Cuni156Duni156Euni156Funi1570uni1571uni1572uni1573uni1574uni1575uni1576uni1577uni1578uni1579uni157Auni157Buni157Cuni157Duni157Euni157Funi1580uni1581uni1582uni1583uni1584uni1585uni1586uni1587uni1588uni1589uni158Auni158Buni158Cuni158Duni158Euni158Funi1590uni1591uni1592uni1593uni1594uni1595uni1596uni1597uni1598uni1599uni159Auni159Buni159Cuni159Duni159Euni159Funi15A0uni15A1uni15A2uni15A3uni15A4uni15A5uni15A6uni15A7uni15A8uni15A9uni15AAuni15ABuni15ACuni15ADuni15AEuni15AFuni15B0uni15B1uni15B2uni15B3uni15B4uni15B5uni15B6uni15B7uni15B8uni15B9uni15BAuni15BBuni15BCuni15BDuni15BEuni15BFuni15C0uni15C1uni15C2uni15C3uni15C4uni15C5uni15C6uni15C7uni15C8uni15C9uni15CAuni15CBuni15CCuni15CDuni15CEuni15CFuni15D0uni15D1uni15D2uni15D3uni15D4uni15D5uni15D6uni15D7uni15D8uni15D9uni15DAuni15DBuni15DCuni15DDuni15DEuni15DFuni15E0uni15E1uni15E2uni15E3uni15E4uni15E5uni15E6uni15E7uni15E8uni15E9uni15EAuni15EBuni15ECuni15EDuni15EEuni15EFuni15F0uni15F1uni15F2uni15F3uni15F4uni15F5uni15F6uni15F7uni15F8uni15F9uni15FAuni15FBuni15FCuni15FDuni15FEuni15FFuni1600uni1601uni1602uni1603uni1604uni1605uni1606uni1607uni1608uni1609uni160Auni160Buni160Cuni160Duni160Euni160Funi1610uni1611uni1612uni1613uni1614uni1615uni1616uni1617uni1618uni1619uni161Auni161Buni161Cuni161Duni161Euni161Funi1620uni1621uni1622uni1623uni1624uni1625uni1626uni1627uni1628uni1629uni162Auni162Buni162Cuni162Duni162Euni162Funi1630uni1631uni1632uni1633uni1634uni1635uni1636uni1637uni1638uni1639uni163Auni163Buni163Cuni163Duni163Euni163Funi1640uni1641uni1642uni1643uni1644uni1645uni1646uni1647uni1648uni1649uni164Auni164Buni164Cuni164Duni164Euni164Funi1650uni1651uni1652uni1653uni1654uni1655uni1656uni1657uni1658uni1659uni165Auni165Buni165Cuni165Duni165Euni165Funi1660uni1661uni1662uni1663uni1664uni1665uni1666uni1667uni1668uni1669uni166Auni166Buni166Cuni166Duni166Euni166Funi1670uni1671uni1672uni1673uni1674uni1675uni1676uni1677uni1678uni1679uni167auni167buni167cuni167duni167euni167funi18b0uni18b1uni18b2uni18b3uni18b4uni18b5uni18b6uni18b7uni18b8uni18b9uni18bauni18bbuni18bcuni18bduni18beuni18bfuni18c0uni18c1uni18c2uni18c3uni18c4uni18c5uni18c6uni18c7uni18c8uni18c9uni18cauni18cbuni18ccuni18cduni18ceuni18cfuni18d0uni18d1uni18d2uni18d3uni18d4uni18d5uni18d6uni18d7uni18d8uni18d9uni18dauni18dbuni18dcuni18dduni18deuni18dfuni18e0uni18e1uni18e2uni18e3uni18e4uni18e5uni18e6uni18e7uni18e8uni18e9uni18eauni18ebuni18ecuni18eduni18eeuni18efuni18f0uni18f1uni18f2uni18f3uni18f4uni18f5uni1E00uni1E01 Bdotaccent bdotaccentuni1E04uni1E05uni1E06uni1E07uni1E08uni1E09 Ddotaccent ddotaccentuni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1D Fdotaccent fdotaccentuni1E20uni1E21 Hdotaccent hdotaccentuni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Eidieresisacuteuni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3F Mdotaccent mdotaccentuni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55 Pdotaccent pdotaccent Rdotaccent rdotaccentuni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5F Sdotaccent sdotaccent Sdotbelow sdotbelowuni1E64uni1E65uni1E66uni1E67uni1E68uni1E69 Tdotaccent tdotaccent Tdotbelow tdotbelowuni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8D Ydotaccent ydotaccentuni1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1e9auni1E9B Adotbelow adotbelow Ahookabove ahookaboveAcircumflexacuteacircumflexacuteAcircumflexgraveacircumflexgraveAcircumflexhookaboveacircumflexhookaboveAcircumflextildeacircumflextildeAcircumflexdotbelowacircumflexdotbelow Abreveacute abreveacute Abrevegrave abrevegraveAbrevehookaboveabrevehookabove Abrevetilde abrevetildeAbrevedotbelowabrevedotbelow Edotbelow edotbelow Ehookabove ehookaboveEtildeetildeEcircumflexacuteecircumflexacuteEcircumflexgraveecircumflexgraveEcircumflexhookaboveecircumflexhookaboveEcircumflextildeecircumflextildeEcircumflexdotbelowecircumflexdotbelow Ihookabove ihookabove Idotbelow idotbelow Odotbelow odotbelow Ohookabove ohookaboveOcircumflexacuteocircumflexacuteOcircumflexgraveocircumflexgraveOcircumflexhookaboveocircumflexhookaboveOcircumflextildeocircumflextildeOcircumflexdotbelowocircumflexdotbelow Ohornacute ohornacute Ohorngrave ohorngraveOhornhookaboveohornhookabove Ohorntilde ohorntilde Ohorndotbelow ohorndotbelow Udotbelow udotbelow Uhookabove uhookaboveuni1EE8 uhornacute Uhorngrave uhorngraveUhornhookaboveuhornhookabove Uhorntilde uhorntilde Uhorndotbelow uhorndotbelowYgraveygrave Ydotbelow ydotbelow Yhookabove yhookaboveYtildeytildeuni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBClenisprosgegrammenipsili perispomenidialytikaperispomeniuni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCC psilivaria psilioxiapsiliperispomeniuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDB dasiavaria dasiaoxiadasiaperispomeniuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECdialytikavaria dialytikaoxiavariauni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCoxiadasiaenquademquadenspaceemspacethreeperemspacefourperemspace sixperemspace figurespacepunctuationspace thinspace hairspacezerowidthspacezerowidthnonjoinerzerojoinuni200Euni200F hyphentwo hyphennobreak figuredash quotedashdblverticalbar underscoredbl quotereversed quotedblrevtrianglebulletonedotenleadertwodotenleader hyphendot lineseparatorparagraphseparatorlrerlepdflrorlouni202Fpertenthousandprimesecond primetripleprimerev primedblrevprimetriplerevcaret referencemark exclamdbl interrobangoverlineuni203Ftie caretinsertasterism hyphenbulletuni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Fclosureuni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064 zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior plussuperior minussuperior equalsuperiorparenleftsuperiorparenrightsuperior nsuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior plusinferioruni208B equalinferiorparenleftinferiorparenrightinferioruni2090uni2091uni2092uni2093uni2094 colonmonetarycruzeiroliramilluni20A6pesetauni20A8won afii57636dongEurouni20ADuni20AEuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20b8leftharpoonaccentrightharpoonaccentuni20D2uni20D3uni20d4uni20d5uni20D6uni20D7uni20d8uni20d9uni20dauni20DBuni20DCuni20DDuni20DEuni20DFuni20E0uni20E1uni20e4uni20E5uni20E6uni20E7uni20E8uni20E9uni20EAuni20EBuni20ECuni20EDuni20EEuni20EFuni20F0 accountofaddresssubjectCbb centigradeCLcareofcadaunaEulerscruple fahrenheitHscript HblackletterHbbplanck planckover2piIscriptIfrakturLscriptlitrelbbarNbbnumero recordright weierstrassPbbQbbRscriptRfrakturRbb prescriptionresponse servicemark telephoneversicleZbbOhmmho Zblackletteriotaturn degreekelvinangstromBscript Cblackletter estimatedescriptEscriptFscriptFturnMscript alephmathbethmath gimelmath dalethmathuni2139uni213auni213buni213cuni213euni213funi2141uni2142uni2143uni2144uni214auni214buni214duni214eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupleft arrowuprightarrowdownright arrowdownleft arrowbarright arrowhookleftarrowhookrightcarriagereturnharpoonleftbarbuparrowleftbothalfharpoonupright harpoonupleftharpoonrightbarbuparrowrightbothalfharpoondownrightharpoondownleftharpoonrightleft arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblboth arrowdblbothvarrowsquiggleright universal existentialemptyset Delta.mathgradientelement notelementuni220Asuchthat notcontains ownersmalluni2210uni2213dotplus slashmath backslashmath asteriskmathuni2219 proportionalangledividesnotbarparallel notparallel logicaland logicalor intersectionunionuni222Cuni222Duni222E thereforesimilar reversedtildelazysinv wreathproduct notsimilaruni2242 asymptequalnotasymptequal congruentapproxnotequalnotapproxequaluni2249equivasymptotic approaches equivalence notidenticalmuchless muchgreaternotequivasymptoticnotless notgreater notlessequalnotgreaterequaluni2272uni2273precedesfollows precedesequal followsequal notprecedes notsucceedssubsetsuperset notsubset notsuperset reflexsubsetreflexsuperset notsubseteqlnotsuperseteqluni228C squareimagesquareoriginal subsetsqequalsupersetsqequalintersectionsqunionsq circleplusuni2296circlemultiply circledivide circledot turnstilelefttacklefttackdown perpendicular assertion truestate triangleright trianglelefttriangleftequaltriangrightequalnarylogicaland narylogicalornaryintersection naryuniondotmathuni22C6bowtiepreceedsnotequalfollowsnotequalnotsubsetsqequalnotsupersetsqequaluni2300 ceilingleft ceilingright floorleft floorright integraltp integralbtfrown slurbelow angleleft anglerightuni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23AEuni2400uni2401uni2402uni2403uni2404uni2405uni2406uni2407uni2408uni2409uni240auni240buni240cuni240duni240euni240funi2410uni2411uni2412uni2413uni2414uni2415uni2416uni2417uni2418uni2419uni241auni241buni241cuni241duni241euni241funi2420uni2421blankbblankuni2424uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254BSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxsquare boxrounded boxnestedsquarehorizontalfillsquareverticalfillsquareorthogonalcrosshatchfillboxleftdiaghatchboxrtdiaghatchboxcrossdiaghatchsquaresmallsolidwhitesmallsquare filledrect rectanglefilledvertrect vertrectanglefilledparallelogram parallelogram trianglesolidtrianglesmalltrianglesld smalltriangleblackrightpointingtrianglewhiterightpointingtrianglesmalltrianglerightsldsmalltrianglerightblackrightpointingpointer triagrtopentriangledownsld triangleinvsmalltriangleinvsldsmalltriangleinvblackleftpointingtrianglewhiteleftpointingtrianglesmalltriangleleftsldsmalltriangleleftblackleftpointingpointer triaglfopen diamondsolid diamondrhombdiamondrhombnestedfisheyecircle dottedcirclecircleverthatchbullseye circlesolid circleleftsldcirclerightsldcirclebottomsld circletopsld circlenesld circlenwopensemicircleleftsldsemicirclelertsld bulletinversewhitecircleinverseinvsemicircleupinvsemicircledn nwquadarc nequadarc sequadarc swquadarctoparc bottomarc trianglesesld triangleswsld tranglenwsld trianglenesld whitebullet squareleftsldsquarerightsld squarenwsld squaresesldsquarevertbisect triangledottriangleleftsldtrianglerightsld largecircleuni25f0uni25f1uni25f2uni25f3uni25f4uni25f5uni25f6uni25f7uni25f8uni25f9uni25fauni25fbuni25fcuni25fduni25feuni25ffuni262Cspade heartopen diamondopenclubspadesuitwhiteheartdiamond clubsuitwhiteuni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2740uni2A00uni2A01uni2A02uni2A03uni2A04uni2A09uni2D30uni2D31uni2D32uni2D33uni2D34uni2D35uni2D36uni2D37uni2D38uni2D39uni2D3Auni2D3Buni2D3Cuni2D3Duni2D3Euni2D3Funi2D40uni2D41uni2D42uni2D43uni2D44uni2D45uni2D46uni2D47uni2D48uni2D49uni2D4Auni2D4Buni2D4Cuni2D4Duni2D4Euni2D4Funi2D50uni2D51uni2D52uni2D53uni2D54uni2D55uni2D56uni2D57uni2D58uni2D59uni2D5Auni2D5Buni2D5Cuni2D5Duni2D5Euni2D5Funi2D60uni2D61uni2D62uni2D63uni2D64uni2D65uni2D6Funi2E17uniA500uniA501uniA502uniA503uniA504uniA505uniA506uniA507uniA508uniA509uniA50AuniA50BuniA50CuniA50DuniA50EuniA50FuniA510uniA511uniA512uniA513uniA514uniA515uniA516uniA517uniA518uniA519uniA51AuniA51BuniA51CuniA51DuniA51EuniA51FuniA520uniA521uniA522uniA523uniA524uniA525uniA526uniA527uniA528uniA529uniA52AuniA52BuniA52CuniA52DuniA52EuniA52FuniA530uniA531uniA532uniA533uniA534uniA535uniA536uniA537uniA538uniA539uniA53AuniA53BuniA53CuniA53DuniA53EuniA53FuniA540uniA541uniA542uniA543uniA544uniA545uniA546uniA547uniA548uniA549uniA54AuniA54BuniA54CuniA54DuniA54EuniA54FuniA550uniA551uniA552uniA553uniA554uniA555uniA556uniA557uniA558uniA559uniA55AuniA55BuniA55CuniA55DuniA55EuniA55FuniA560uniA561uniA562uniA563uniA564uniA565uniA566uniA567uniA568uniA569uniA56AuniA56BuniA56CuniA56DuniA56EuniA56FuniA570uniA571uniA572uniA573uniA574uniA575uniA576uniA577uniA578uniA579uniA57AuniA57BuniA57CuniA57DuniA57EuniA57FuniA580uniA581uniA582uniA583uniA584uniA585uniA586uniA587uniA588uniA589uniA58AuniA58BuniA58CuniA58DuniA58EuniA58FuniA590uniA591uniA592uniA593uniA594uniA595uniA596uniA597uniA598uniA599uniA59AuniA59BuniA59CuniA59DuniA59EuniA59FuniA5A0uniA5A1uniA5A2uniA5A3uniA5A4uniA5A5uniA5A6uniA5A7uniA5A8uniA5A9uniA5AAuniA5ABuniA5ACuniA5ADuniA5AEuniA5AFuniA5B0uniA5B1uniA5B2uniA5B3uniA5B4uniA5B5uniA5B6uniA5B7uniA5B8uniA5B9uniA5BAuniA5BBuniA5BCuniA5BDuniA5BEuniA5BFuniA5C0uniA5C1uniA5C2uniA5C3uniA5C4uniA5C5uniA5C6uniA5C7uniA5C8uniA5C9uniA5CAuniA5CBuniA5CCuniA5CDuniA5CEuniA5CFuniA5D0uniA5D1uniA5D2uniA5D3uniA5D4uniA5D5uniA5D6uniA5D7uniA5D8uniA5D9uniA5DAuniA5DBuniA5DCuniA5DDuniA5DEuniA5DFuniA5E0uniA5E1uniA5E2uniA5E3uniA5E4uniA5E5uniA5E6uniA5E7uniA5E8uniA5E9uniA5EAuniA5EBuniA5ECuniA5EDuniA5EEuniA5EFuniA5F0uniA5F1uniA5F2uniA5F3uniA5F4uniA5F5uniA5F6uniA5F7uniA5F8uniA5F9uniA5FAuniA5FBuniA5FCuniA5FDuniA5FEuniA5FFuniA600uniA601uniA602uniA603uniA604uniA605uniA606uniA607uniA608uniA609uniA60AuniA60BuniA60CuniA60DuniA60EuniA60FuniA610uniA611uniA612uniA613uniA614uniA615uniA616uniA617uniA618uniA619uniA61AuniA61BuniA61CuniA61DuniA61EuniA61FuniA620uniA621uniA622uniA623uniA624uniA625uniA626uniA627uniA628uniA629uniA62AuniA62B lowcircumflex colonmodifier shortequalsSaltillosaltillocresc_cyrillic dot_cyrillictitlo_cyrillicyi_yi_lig_ukrainian ucas.ringucas.horizlineucas.shortvertucas.righttack ucas.lefttack NameMe.E968 NameMe.E969 NameMe.96A bn_initekaar bn_initaikaarbn_reph bn_kaphala bn_nnaphala bn_taphala bn_thaphala bn_thaphala1 bn_dhaphala bn_naphala bn_below_ba bn_bhaphala bn_raphala bn_laphala bn_half_ka bn_half_kha bn_half_ga bn_half_gha bn_half_nga bn_half_ca bn_half_ca1 bn_half_cha bn_half_ja bn_half_jha bn_half_nya bn_half_tta bn_half_ttha bn_half_dda bn_half_ddha bn_half_nna bn_half_tha bn_half_dha bn_half_da bn_half_na bn_half_pa bn_half_pha bn_half_ba bn_half_bha bn_half_ma bn_half_ya bn_half_ra bn_half_la bn_half_sha bn_half_ssa bn_half_sa bn_half_ha bn_half_rra bn_half_rha bn_half_yyabn_half_asamirabn_half_asamiba bn_khaphala bn_phaphala bn_baphala1 bn_maphala bn_maphala1 bn_yaphalabn_k_rabn_k_ra1bn_kh_rabn_g_rabn_gh_rabn_c_rabn_ch_rabn_j_rabn_tt_ra bn_tth_rabn_dd_ra bn_ddh_rabn_t_rabn_t_ra1bn_th_rabn_d_rabn_dh_rabn_n_rabn_n_ra1bn_p_rabn_ph_rabn_b_rabn_bh_ra bn_bh_ra1bn_m_rabn_y_rabn_sh_rabn_ss_rabn_s_rabn_s_ra1bn_h_ra bn_asamir_ra bn_asamib_ra bn_k_ss_rabn_k_kabn_k_tta bn_k_tt_rabn_k_tabn_k_ta1 bn_k_t_ba bn_k_t_ba1 bn_k_t_ra bn_k_t_ra1 bn_k_t_ra2bn_k_nabn_k_mabn_k_labn_k_ssa bn_k_ss_nna bn_k_ss_mabn_k_sabn_g_gabn_g_dabn_g_dha bn_g_dh_babn_g_labn_g_nabn_g_mabn_gh_nabn_ng_ka bn_ng_k_ra bn_ng_k_ssa bn_ng_k_ss_ra bn_ng_khabn_ng_ga bn_ng_gha bn_ng_gh_rabn_ng_ma bn_ng_ma1bn_c_cabn_c_cha bn_c_ch_ba bn_c_ch_rabn_c_nyabn_c_nabn_j_ja bn_j_j_babn_j_jhabn_j_nyabn_ny_ca bn_ny_chabn_ny_ja bn_ny_jha bn_tt_tta bn_tt_tt_rabn_tt_mabn_dd_ga bn_dd_ddabn_dd_ma bn_nn_tta bn_nn_tt_ra bn_nn_ttha bn_nn_dda bn_nn_dda1 bn_nn_dd_ra bn_nn_dd_ra1 bn_nn_ddha bn_nn_nnabn_nn_mabn_t_ta bn_t_t_babn_t_thabn_t_nabn_t_mabn_t_ma1bn_t_labn_d_gabn_d_ghabn_d_da bn_d_d_ba bn_d_d_rabn_d_dha bn_d_dh_babn_d_nabn_d_bha bn_d_bh_ra bn_d_bh_ra1bn_d_mabn_dh_nabn_dh_mabn_n_tta bn_n_tt_ra bn_n_tthabn_n_dda bn_n_dd_ra bn_n_ddhabn_n_ta bn_n_t_ba bn_n_t_ra bn_n_t_ra1bn_n_thabn_n_da bn_n_d_ba bn_n_d_rabn_n_dha bn_n_dh_ba bn_n_dh_rabn_n_nabn_n_mabn_n_ma1bn_n_sabn_p_ttabn_p_tabn_p_pabn_p_mabn_p_nabn_p_labn_p_sa bn_ph_ttabn_ph_labn_b_jabn_b_da bn_b_d_rabn_b_dhabn_b_nabn_b_bhabn_b_labn_bh_labn_m_tabn_m_thabn_m_dabn_m_nabn_m_na1bn_m_pa bn_m_p_ra bn_m_p_labn_m_pha bn_m_ph_rabn_m_bha bn_m_bh_ra bn_m_bh_ra1bn_m_mabn_m_ma1bn_m_labn_m_la1bn_m_sa bn_m_s_rabn_l_kabn_l_gabn_l_tta bn_l_tt_rabn_l_dda bn_l_dd_rabn_l_tabn_l_dabn_l_dhabn_l_pabn_l_pha bn_l_ph_rabn_l_mabn_l_labn_sh_ca bn_sh_chabn_sh_tabn_sh_nabn_sh_mabn_sh_labn_ss_ka bn_ss_k_ra bn_ss_k_ra1 bn_ss_tta bn_ss_tta1 bn_ss_tt_ra bn_ss_tt_ra1 bn_ss_ttha bn_ss_nnabn_ss_pa bn_ss_p_ra bn_ss_pha bn_ss_ph_rabn_ss_ma bn_ss_ma1bn_s_ka bn_s_k_ra bn_s_k_ra1bn_s_khabn_s_tta bn_s_tta1 bn_s_tt_ra bn_s_tt_ra1bn_s_ta bn_s_t_ba bn_s_t_ra bn_s_t_ra1bn_s_thabn_s_nabn_s_na1bn_s_pa bn_s_p_ra bn_s_p_labn_s_pha bn_s_ph_rabn_s_mabn_s_ma1bn_s_labn_s_la1bn_h_nnabn_h_nabn_h_mabn_h_labn_h_la1bn_rr_gabn_k_babn_g_babn_gh_babn_c_babn_ch_babn_j_babn_tt_babn_dd_babn_nn_babn_t_babn_th_babn_d_babn_dh_ba bn_dh_ba1bn_n_babn_n_ba1bn_p_babn_b_babn_bh_babn_m_ba bn_m_b_rabn_m_ba1 bn_m_b_ra1bn_l_babn_sh_babn_s_babn_s_ba1bn_h_babn_h_ba1 bn_kh_r_ukaarbn_kh_r_uukaar bn_g_ukaar bn_g_r_ukaar bn_g_r_uukaar bn_g_l_ukaar bn_g_l_uukaar bn_j_r_ukaar bn_j_r_uukaar bn_t_r_ukaar bn_t_r_uukaar bn_th_r_ukaarbn_th_r_uukaar bn_d_ukaar bn_d_r_ukaar bn_d_r_uukaar bn_dh_r_ukaarbn_dh_r_uukaar bn_n_ukaar bn_n_uukaar bn_n_rikaar bn_n_t_ukaarbn_n_d_r_ukaarbn_n_d_r_uukaar bn_p_r_ukaar bn_p_r_uukaar bn_p_l_ukaar bn_p_l_uukaar bn_b_r_ukaar bn_b_r_uukaar bn_b_l_ukaar bn_b_l_uukaar bn_bh_r_ukaarbn_bh_r_uukaar bn_m_r_ukaar bn_m_r_uukaarbn_m_p_r_ukaarbn_m_p_r_uukaar bn_r_ukaar bn_r_uukaar bn_l_g_ukaar bn_sh_ukaar bn_sh_r_ukaarbn_sh_r_uukaar bn_sh_l_ukaarbn_sh_l_uukaarbn_ss_p_r_ukaarbn_ss_p_r_uukaar bn_s_ukaar bn_s_uukaar bn_s_rikaar bn_s_t_ukaar bn_s_r_ukaar bn_s_r_uukaarbn_s_p_r_ukaarbn_s_p_r_uukaarbn_s_p_l_ukaarbn_s_p_l_uukaar bn_s_l_ukaar bn_s_l_uukaar bn_h_ukaar bn_h_rikaarbn_asamir_ukaarbn_asamir_uukaarbn_asamib_ukaarbn_asamib_uukaarbn_asamib_r_ukaarbn_asamib_r_uukaar bn_k_hasanta bn_kh_hasanta bn_g_hasanta bn_gh_hasanta bn_ng_hasanta bn_c_hasanta bn_ch_hasanta bn_j_hasanta bn_jh_hasanta bn_ny_hasanta bn_tt_hasantabn_tth_hasanta bn_dd_hasantabn_ddh_hasanta bn_nn_hasanta bn_t_hasanta bn_th_hasanta bn_d_hasanta bn_dh_hasanta bn_n_hasanta bn_p_hasanta bn_ph_hasanta bn_b_hasanta bn_bh_hasanta bn_m_hasanta bn_y_hasanta bn_r_hasanta bn_l_hasanta bn_sh_hasanta bn_ss_hasanta bn_s_hasanta bn_h_hasanta bn_rr_hasanta bn_rh_hasanta bn_yy_hasantabn_asamir_hasantabn_asamib_hasanta bn_post_k_raglyph569glyph570glyph571glyph572glyph57487 bn_baphala bn_below_ba2glyph578glyph579glyph580glyph581glyph582glyph583 bn_sh_ra.001bn_yaphala.002bn_d_yabn_n_ya bn_la.001bn_sh_yabn_ss_yabn_s_yaglyph593bn_h_yaglyph595 bn_ss_tta.002glyph597glyph598 bn_uukaar.1glyph600Adeva002Adeva003 deva_tta_nuktdeva_ttha_nukta.nuktglyph240glyph241deva_ii_anusvara.abvsdeva_e_candra_bindu.abvsdeva_o_cand_bindu.abvsdeva_au_ra_virama_candra_bindudeva_ai_ra_virama_candra_bindudeva_ra_virama_candra_binduhadeva_viramadeva.halnchadeva_virama.nuktchadeva_viramadeva.halnhadeva_rrvoc_ic_deva.blwskadeva_viramadeva_ssadeva.akhnjadeva_viramadeva_nyadeva.akhnuni924_94D.half_924.presuni924_930_94D.blwf.vatuuni936_94D.half_91A.presuni936_930_94D.blwf.vatuuni936_94D.half_935.presuni95B_930_94D.blwf.vatuuni92B_930_94D.blwf.vatuuni95E_930_94D.blwf.vatuuni92A_930_94D.blwf.vatuuni938_930_94D.blwf.vatudeva_ra_u.blwsdeva_ra_uu.blwsuni915_94D.half_928.preskhadeva_094D.half_0928.presghadeva_094D.half_0928.presglyph269deva_ka_virama.halfdeva_kha_virama.halfdeva_ga_virama.halfdeva_gha_virama.halfdeva_ca_virama.halfglyph275deva_ja_virama.halfdeva_jha_virama.halfdeva_nya_virama.halftadeva_094D.half_0928.presthadeva_094D.half_0928.presdadeva_094D.half_0928.presdeva_dha_094D.half_0928.presdeva_nna_virama.halfdeva_ta_virama.halfdeva_tha_virama.halfuni926_94D.hlf2_926_94D.presdeva_dha_virama.halfdeva_na_virama.halfglyph289deva_pa_virama.halfdeva_pha_virama.halfdeva_ba_virama.halfdeva_bha_virama.halfdeva_ma_virama.halfdeva_ya_virama.halfpadeva_094D.half_0928.presglyph297deva_la_virama.halfdeva_lla_virama.halfdeva_llla_virama.halfdeva_va_virama.halfdeva_sha_virama.halfdeva_ssa_virama.halfdeva_sa_virama.halfdeva_ha_virama.halfglyph306badeva_094D.half_0928.presglyph308madeva_094D.half_0928.presvadeva_094D.half_0928.presshadeva_094D.half_0928.preskadeva_094D.half_0915.presngadeva_094D.half_0915.presngadeva_094D.half_0916.presngadeva_094D.half_0917.presngadeva_094D.half_0918.presnyadeva_094D.half_091C.presdadeva_094D.half_0918.presdadeva_094D.half_0926.presdadeva_094D.half_0927.presdadeva_094D.half_092C.presdadeva_094D.half_092D.presdadeva_094D.half_092E.presdadeva_094D.half_092F.presdadeva_094D.half_0935.presttadeva_094D.half_091F.presttadeva_094D.half_0920.prestthadeva_094D.half_0920.presglyph329glyph330glyph331hadeva_094D.half_092E.preshadeva_094D.half_092F.presladeva_094D.half_0939.presglyph335u9_38_4D.hlf_24_4D_30prespresglyph337ra_viramadeva_afii301.halfu91A_94D.hlf2_91A_94D.halfsadeva_0928_094D.half.presglyph341glyph342glyph343glyph344glyph345glyph346glyph347glyph348glyph349uni915_94D_937.akhn_94D.halfu91C_94D_91E.akhn_94D.halfglyph352u924_94D.half_930_94D.blwf.vatuglyph354glyph355glyph356glyph357glyph358glyph359uni939_930_94D.blwf.blwsdeva_ra_virama.rphfdeva_ra_virama.blwfdeva_aa_candrabindu.abvsdeva_aa_anusvara.abvsglyph365glyph366glyph367glyph368glyph369deva_e_anusvara.abvsglyph371glyph372deva_ai_anusvara.abvsglyph374glyph375glyph376glyph377glyph378u9_38_4Dhalf1F_30_4Dblwfvtu2glyph380nadeva_094D.half_0928.presnga_viramadeva.halftta_viramadeva.halfttha_viramadeva.halfdda_viramadeva.halfddha_viramadeva.halfda_viramadeva.halfuni915_930_94D.blwf.vatuuni916_930_94D.blwf.presuni917_930_94D.blwf.presuni918_930_94D.blwf.vatuuni919_930_94D.blwf.vatuuni91A_930_94D.blwf.vatuuni91B_930_94D.blwf.vatuuni91C_930_94D.blwf.vatuuni91D_930_94D.blwf.vatuuni91E_930_94D.blwf.vatuuni91F_930_94D.blwf.vatuuni920_930_94D.blwf.vatuuni921_930_94D.blwf.vatuglyph402uni923_930_94D.blwf.vatutadeva_viramadeva_radeva.presuni925_930_94D.blwf.vatuuni926_930_94D.blwf.vatuuni927_930_94D.blwf.vatuuni928_930_94D.blwf.vatuuni92C_930_94D.blwf.vatuuni92D_930_94D.blwf.vatuuni92E_930_94D.blwf.vatuuni92F_930_94D.blwf.vatuuni930_930_94D.blwf.vatuuni932_930_94D.blwf.vatuuni936_94D.hlf2_932_94D.presuni937_94D.half_91F.presuni937_94D.half_920.presglyph418glyph419glyph420uni936_94D.hlf2_928_94D.presu938_4D.hlff24_4D.30_4Dbfvtuprsu926_94D.half_92E_94D.half.presuni924_94D.hlf2_928_94D.presuni939_94D.half_923.presuni939_94D.half_932.presuni939_94D.half_935.presu92A_94D.half_924_94D.half.presuni939_94D.half_928.presu939_94D.half_92E_94D.half.presu92A_94D.half_930_94D.blwf.vatungadeva_nuktadeva.nukt hadeva_nukt dadeva_nuktttadeva_nukt.halnuni920_93C.nukt_94D.halndddhadeva_viramadeva.halnrhadeva_viramadeva.halndadeva_nukt_viramauni939_93C.nukt_94D.halnuni919_93C.nukt_94D.halnu937_94D.half_91F.pres_94D.halnu937_94D.half_920.pres_94D.halnu939_94D.half_923.pres_94D.halnu939_94D.half_928.pres_94D.halnu939_94D.half_932.pres_94D.halnu939_94D.half_935.pres_94D.halnphadev_nuktadev_vir_dev.nuktjadev_nuktadev_vir_dev.nuktkagujarati_viramagujarati.halfkhagujarati_viramagujarati.halfgagujarati_viramagujarati.halfghagujarati_viramagujarati.halfcagujarati_viramagujarati.halfjagujarati_viramagujarati.halfjhagujarati_viramagujarati.halfnyagujarati_viramagujarati.halfnnagujarati_viramagujarati.halftagujarati_viramagujarati.halfthagujarati_viramagujarati.halfdhagujarati_viramagujarati.halfnagujarati_viramagujarati.halfpagujarati_viramagujarati.halfphagujarati_viramagujarati.halfbagujarati_viramagujarati.halfbhagujarati_viramagujarati.halfmagujarati_viramagujarati.halfyagujarati_viramagujarati.halflagujarati_viramagujarati.halfllagujarati_viramagujarati.halfvagujarati_viramagujarati.halfshagujarati_viramagujarati.halfssagujarati_viramagujarati.halfsagujarati_viramagujarati.halfhagujarati_viramagujarati.halfuniA95_ACD_AB7.akhn_ACD.halfuAA4_ACD.half_AA4_ACD.half.presuniAA4_ACD.half_AB0_ACD.vatuuAA8_ACD.half_AA8.pres_ACD.presuAB6_ACD.half_AB0_ACD.blwf.vatuuA96_ACD.half_AB0_ACD.blwf.vatuuA97_ACD.half_AB0_ACD.blwf.vatuuA98_ACD.half_AB0_ACD.blwf.vatuuA9A_ACD.half_AB0_ACD.blwf.vatuuA9C_ACD.half_AB0_ACD.blwf.vatuuAA5_ACD.half_AB0_ACD.blwf.vatuuAA7_ACD.half_AB0_ACD.blwf.vatuuAA8_ACD.half_AB0_ACD.blwf.vatuuAAA_ACD.half_AB0_ACD.blwf.vatuuAAC_ACD.half_AB0_ACD.blwf.vatuuAAD_ACD.half_AB0_ACD.blwf.vatuuAAE_ACD.half_AB0_ACD.blwf.vatuuAB8_ACD.half_AB0_ACD.blwf.vatuigujarati_anusvaragujarati.abvsguj_ii_anusvara.abvsugujarati_anusvaragujarati.abvsguj_uu_anusvara.abvsuniA95_ACD.half_A95.presuniA95_AB0_ACD.blwf.vatuguj_ja_aa.pstsguj_ja_ii.pstsuniA9C_AB0_ACD.blwf.vatuuniA9D_AB0_ACD.blwf.vatuguj_tta_virama_tta.presguj_tta_virama_ttha.presguj_ttha_virama_ttha.presguj_dda_virama_dda.presguj_dda_virama_ddha.presuniAA6_AB0_ACD.blwf.vatuguj_da_virama_ma.presguj_da_virama_da.presguj_da_virama_dha.presguj_da_virama_va.presuniAAB_AB0_ACD.blwf.vatu guj_ra_u.blwsguj_ra_uu.blwsnounicode_3_1_cduAB5_ACD.half_AB0_ACD.blwf.vatuuniAB6_ACD.half_AB5_ACD.presuniAB9_AB0_ACD.blwf.vatuuniAB9_ACD.half_AAE.presuniAB9_ACD.half_AAF.presuAB6_ACD.half_AA8.pres_ACD.presuniAB6_ACD.half_A9A_ACD.presguj_ddha_virama_ddha.presguj_ka_virama_ssa.akhnuniAA4_ACD.half_AA4.presuniAA4_AB0_ACD.blwf.vatuuniAA8_ACD.half_AA8.presuniAB6_AB0_ACD.blwf.vatuuniA96_AB0_ACD.blwf.vatuuniA97_AB0_ACD.blwf.vatuuniA98_AB0_ACD.blwf.vatuuniA9A_AB0_ACD.blwf.vatuuniAA5_AB0_ACD.blwf.vatuuniAA7_AB0_ACD.blwf.vatuuniAA8_AB0_ACD.blwf.vatuuniAAA_AB0_ACD.blwf.vatuuniAAC_AB0_ACD.blwf.vatuuniAAD_AB0_ACD.blwf.vatuuniAAE_AB0_ACD.blwf.vatuuniAB8_AB0_ACD.blwf.vatuuniAB5_AB0_ACD.blwf.vatuuniAB6_ACD.half_AB5.presuniAB6_ACD.half_AA8.presuniAB6_ACD.half_A9A.presguj_ra_virama.rphfguj_ra_virama.blwfuniAB7_ACD.half_AA0.presuniAB7_ACD.half_A9F.presuA_B7_CD.half_9F_B0_CD.blwfvatuuA_B7_CD.half_A0_B0_CDblwfvatuuniA9F_AB0_ACD.blwf.vatuguj_ja_virama_nya.akhnuniAA1_AB0_ACD.blwf.vatuuniAA0_AB0_ACD.blwf.vatuuniAA2_AB0_ACD.blwf.vatuglyph437glyph438glyph440glyph441guj_e_anusvara.abvsglyph443glyph444glyph445glyph446glyph447glyph448glyph449glyph450glyph451glyph452glyph453kagujarati_nuktagujarati.nuktkhagujarati_nuktagujarati.nuktgagujarati_nuktagujarati.nuktghagujarati_nuktagujarati.nuktngagujarati_nuktagujarati.nuktcagujarati_nuktagujarati.nuktchagujarati_nuktagujarati.nuktjagujarati_nuktagujarati.nuktjhagujarati_nuktagujarati.nuktnyagujarati_nuktagujarati.nuktttagujarati_nuktagujarati.nukttthagujarati_nuktagujarati.nuktddagujarati_nuktagujarati.nuktddhagujarati_nuktagujarati.nuktnnagujarati_nuktagujarati.nukttagujarati_nuktagujarati.nuktthagujarati_nuktagujarati.nuktdagujarati_nuktagujarati.nuktdhagujarati_nuktagujarati.nuktnagujarati_nuktagujarati.nuktpagujarati_nuktagujarati.nuktphagujarati_nuktagujarati.nuktbagujarati_nuktagujarati.nuktbhagujarati_nuktagujarati.nuktmagujarati_nuktagujarati.nuktyagujarati_nuktagujarati.nuktragujarati_nuktagujarati.nuktlagujarati_nuktagujarati.nuktllagujarati_nuktagujarati.nuktvagujarati_nuktagujarati.nuktshagujarati_nuktagujarati.nuktssagujarati_nuktagujarati.nuktsagujarati_nuktagujarati.nukthagujarati_nuktagujarati.nuktuniAA3_ACD.half_AB0_ACD.vatuguj_nna_ra_virama.vatugur_ra_halant.blwfgur_va_halant.blwfgur_ha_halant.blwfgur_ya_halant.pstfglyph152glyph153glyph154glyph155glyph156glyph157uniA30_A4D.blwf_A41.blwsuniA39_A4D.blwf_A41.blwsnounicode_3_1_3glyph161ragurmukhi_A4D.blwf_A42.blwsuniA39_A4D.blwf_A42.blwsnounicode_3_1_2fnounicode_3_1_30gur_na_uumatra_tippi.abvsgur_aamatra_bindi.abvsgur_u_addak.pstsgur_uu_addak.pstsgur_oo_addak.psts gur_ka.nukt gur_gha.nukt gur_nga.nukt gur_ca.nukt gur_cha.nukt gur_jha.nukt gur_nya.nukt gur_tta.nukt gur_ttha.nukt gur_ddha.nukt gur_nna.nukt gur_ta.nukt gur_tha.nukt gur_da.nukt gur_dha.nukt gur_na.nukt gur_pa.nukt gur_ba.nukt gur_bha.nukt gur_ma.nukt gur_ya.nukt gur_ra.nukt gur_va.nuktglyph194 gur_ha.nukt gur_a.nukt gur_aa.nukt gur_i.nukt gur_ii.nukt gur_u.nukt gur_uu.nukt gur_ee.nukt gur_ai.nukt gur_oo.nukt gur_au.nuktgur_aa_bindi.abvsglyph207uniA35_A4D.blwf_A41.blwsuniA35_A4D.blwf_A42.blwsuniA30_A4D.blwf_A4D.blwsuniA39_A4D.blwf_A4D.blwsuniA35_A4D.blwf_A4D.blwsEngsamiffffiffllongs_t m_n_armenian m_e_armenian m_i_armenian v_n_armenian m_x_armenianyodhiriqhebrewuniFB1EyodyodpatahhebrewayinaltonehebrewuniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29shinshindothebrewshinsindothebrewshindageshshindothebrewshindageshsindothebrewalefpatahhebrewalefqamatshebrewalefdageshhebrewbetdageshhebrewgimeldageshhebrewdaletdageshhebrewhedageshhebrewvavdageshhebrewzayindageshhebrewtetdageshhebrewyoddageshhebrewfinalkafdageshhebrewkafdageshhebrewlameddageshhebrewmemdageshhebrewnundageshhebrewsamekhdageshhebrewpefinaldageshhebrewpedageshhebrewtsadidageshhebrewqofdageshhebrewreshdageshhebrewshindageshhebrewtavdageshhebrewvavholamhebrew betrafehebrew kafrafehebrew perafehebrewaleflamedhebrewuniFFFDuni10380uni10381uni10382uni10383uni10384uni10385uni10386uni10387uni10388uni10389uni1038auni1038buni1038cuni1038duni1038euni1038funi10390uni10391uni10392uni10393uni10394uni10395uni10396uni10397uni10398uni10399uni1039auni1039buni1039cuni1039duni1039funi103a0uni103a1uni103a2uni103a3uni103a4uni103a5uni103a6uni103a7uni103a8uni103a9uni103aauni103abuni103acuni103aduni103aeuni103afuni103b0uni103b1uni103b2uni103b3uni103b4uni103b5uni103b6uni103b7uni103b8uni103b9uni103bauni103bbuni103bcuni103bduni103beuni103bfuni103c0uni103c1uni103c2uni103c3uni103c8uni103c9uni103cauni103cbuni103ccuni103cduni103ceuni103cfuni103d0uni103d1uni103d2uni103d3uni103d4uni103d5uni10480uni10481uni10482uni10483uni10484uni10485uni10486uni10487uni10488uni10489uni1048auni1048buni1048cuni1048duni1048euni1048funi10490uni10491uni10492uni10493uni10494uni10495uni10496uni10497uni10498uni10499uni1049auni1049buni1049cuni1049duni1049euni1049funi104a0uni104a1uni104a2uni104a3uni104a4uni104a5uni104a6uni104a7uni10900uni10901uni10902uni10903uni10904uni10905uni10906uni10907uni10908uni10909uni1090auni1090buni1090cuni1090duni1090euni1090funi10910uni10911uni10912uni10913uni10914uni10915uni10916uni10917uni10918uni10919uni1091auni1091buni1091f r-./0abcdpqrs^__`#$$%%&&''(()fghiijjknopqqrvw %&,--.011223<=>?BCDEz{         t u        GHHIIJOPQRSTXYYZ[\\]effg    $%%&,--.45566778899:QRRSSTTUUVVW]^^_`aabcddeeffgijjklmmnsttuuvvwz{{|    #$BCCDHIIJ^__`ijjk9::;bcfgijrs"  F 8DFLTzarmnbengbng2cyrldev2devageor$gjr2.grekLgujrVgur2tguruhebrlatnphnxsyrctml2ugarxpeo$  %(*.1  %(*.1  "&-/2  "&-/2  #'+03  #'+03 $), $), JII "ISM .LSM .NLD 6NSM .SKS .! 4aalt:abvs@abvsFabvsLakhnRakhnXakhn^blwfdblwfjblwfpblwfvblws|blwsblwsblwsccmpccmpccmpdligfrachalfhalfhalfhalnhalnhlighliginitligaligaligaligaligaloclnuktnuktnuktprespres pres(pstf0pstf6psts\""# #8'v'')),)D)*,X, -M,L6",bqcr28RX ,>Pbt     .     / $(,28DHLRX&8Z|                                         I "JT^hr|&0:DNXblvsvtvuvvvwvxvyvzv{v|v}v~vvvvvvvvvvvvvvvvvvvvvvvTu$.8BL`jt~w^x^y^^^oz^$^%^{^|^^^o}^~^^/^W^9:;=@CDEFJOS]0V(V`jt~ (2<FPZdnx"""""""""""."/"""""0"""""""""""""2"""""""""" % !&" Cs_]T[" 2o[3oB9@6 , XnoT TTBHNTZ`flrx~   6 "(IOILOLIIWA*  ,,,!YnoT &0:DNXblvUVWXZ[ ]^_^ J<FPZdnx",6@     TWYY[]bdfm ouCC +\fpz$.8BLVblvDoEoFoGooHoJoKoLoooooQoRoSooUoVoXoYoZo[o\o]oo o`oaobocodoeofogoooooooHho9>@LN]24#68&HH)*%PZdnx",6@JT^hr|`abcdeghijklmnoprqstuvwxyz{|}~ #,*  &Pf    "          "         *  TY=YYqu)Xblv",6@JT^hr~(YHYIYJYKY+Y,Y^YaY`YbYnEYLY2YMYNYOY7YPYQYRYGYSYYYYYnnYYYYY Y!Y;YY]_Y\^Y"Y TWYY[\^lrrtt" %S!HR\fpz$.8BLV`jt~5<:7=9;!9<=>?@ABCDEGHIJKLNOPQRTVZ\z}RXfV>HR\fpz$.8BL^^^^^^^^^^^^^^^^^^^^^^^^^^^^  4@Vb._-^/_1a0`Ba "6q5f4e3l'TFg "(AY<qUqWYVg [^Z_@ ^_`ae FV $.@Z n9@LFE; &,LYVGSR }D|C~D  &,28>D\{YzSyRxQwPvKuJt<Dc ?m>l :;DTg@:DNZdv  J\noTV n9@LALBLs@VML4HNLFE;PLL R^LiLkL]lL $V`mL8Y6> DC "(.4\LYVGSR r<q;p:o9 }D|C~D $*06<BHNT\{YzSyRxQwPvKuJt<TOL:;H\DEGLRSTUVXZ\`cdefg:d,NhT"T^J|Xz $  &,28>D &,$*06<  $*06< $*06<"(.4:@FLRX^djpv|   "(.4   &,'&$#"!( &,28>DJPV\bhnt;:8643210/.,+*)$*06<BHNTZ`flIHGFEDCBA@?>=< &,ONMLKJ $*06<BHNT]\[ZYXWUSQP"(.4:@FLRX^djpv|usrqponlkigecb`_ zyxw|`bcdehjkmoqrstuvwx{|}~Z &@,'&,'&,'& 9|8{n.  ?d>c 1fT]:z  *4FPbl(:L^p"4FXbt}  ~                                                         h    : '/=OZgopu, "'=#T$.8#D$D%D&DiXDhXgDHIJK "FPr(& &&% &)% $&,-P *%& +-&Q-%& ,`bijmn*  >>> *z)x[Z*6BN      &0:DNXblv0o.oooooooooooooo?]{|$%%PZdnx",6@JT^hr| #*  &'&/  TDFLTzarmnbengbng2cyrldev2devageorgjr2grekgujr gur2guru(hebr2latnLphnxZsyrcftml2rugar~xpeo    JII    abvmVabvm\blwmbblwmhkernnkerntlfbdzmarkmarkmarkmarkmarkmkmkrtbd     "*2:BLT\dlt|LhPB "$&l,6,-6<DJPV\bhnt,,,,,,,,dX,, P &,28>DJPV\bhntz "(.4:@FLRX^djpv|u}HuuQT6CTSCrn`=y66LT<nYiu!!!Q!!|!!!!!A!!!!6!!!!!!!X!W!!o!!!!;!!!vT!P!!]}G iikmpqv/EIK H 28>DJPV\bhnt].L7W.T+Z.^=@.<#:%_8c8 0&6 XXW{BN  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<X:|bXXkX.W:lP1mXMW;8nX8l88naiXXXXXXjXXXXmmnmW:{yzyiiXXXbXX{{|{;mml mmS`xZNX8mclX88 888l86888W8($=D]4;CHMU]bglrtz|*389HHPRWWZZ^^beggqrtt  &&//44:;==AE !#')*+ , -1 &,28>DJPV\bhntzK]XbT\\[( # "ZXYVWZ  Z"F. d $*06<BHNTZ`flrx~ &,28>DJPV\bhntz X=aDo6xXXXXXX====aDDDD|z{z66666xxXX=D=D=D=D||||666ax$$((,,2288<<DDHHLLRR XX \\ $*27<AGIOQ*3W89arrcj< y $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|O3}[XXk{Xp3eO4mXMW? nonfodj3OYk};m `x^NWX9mm?&?m eo<W.#} y$%&'()*+,-./0123456789:;<=DFHJKLMNOPQRSTUVXZ\]45HPQRVWZ^bcdegqrtvyz{| /12347:;=ABCDE__ #&()+- u v: y |< @ B C D EF &,28>DJPV\bhntz "(.4:@FLRX^djpv|^OUR>X>RAUUUU/UU#U :U,X,S[XURUBB=X&U03>s=[T 2:.@  Yh  28RXy B >~ &,28>DJPV\bhntzSSS l SSSmb SS/<yvh^h^hbhhlphhM/hhjhhAhhjhKl5hkoUhQvU3hMkBkBRnR00b$= D]$ w x } ~  V\bhntz ^Adn1;Q(<   (((((d(\4B "FLRX^djpv| [ $8+TKt  2FFTmou{|}~"(.|`C]%f. D &,28>DJPV\bhntz |yfDmJUUkM_wq)bg.&O L|Q6?.'303h00m_weR; idbD9=?CDEFJOTUWX]w}=>?@DKOTY_abdtuvwxyz{|}~cdefo"(.Xtpk<&J #HNTZ`flrx~T ! *O;$&#0+). - #9TMx *   +FGTmouCD"(.zawlf $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTxaejgdi9jjedce _eqehaXaed ciecgffegaggaeac d hcea egeifga>>5|7@^^ag[i_didieeYgaeagWi#aeg4cge.e:cc^d^gddigcgg^g;e>>A;D>>kjd^^gdaedaagda aeWchgaj^9ddaddd ceecg ddg|7@jigeadaa++,.499 <= ?F HHJQSUWY ]]#ww${}%()$%*)),,1-=@3DD7KK8OO9TT:YY;__<ab=dd?t@TUX^_fghlmnotuxz%&ghijr"(.4:@FLkUgXdGLi@8Xjjkkssuuzz~~ kkww~~jksuz~M$$%%&&''(())**,,--..// 22 33 44 55 66 779:;;<<==          "" $$&&88::??yy      P P Z Z \ \ d d f f  x$$&&**,,--224466779:;;<<==DDFFGGHHII JJMM PQ RRSSTTUUVV WW XXYZ[[ \\]]         !! ""## $$%% &&++--//11338899::;;<< ==>> ??@@ ; ; Q Q Z Z [ [ \ \ ] ] d d e e f f g g    ]$%&'()*,-./2345679:;<= "$&8:?y   P Z \ d f ^NDDEEFFGGHHIIJJ KKNN PQRRSSUU VV WW XX YZ[[ \\]]      !! ## %% ++ -- // 11 33 99<<>>@@       ; ; Q Q [ [ ] ] e e g g HDDFF GGHHIIJJMMPQRR SS TTUU VVWWXX YZ[[\\]]          !!##%%++ -- // 11 33 99<<>>@@22     Q Q [ [ ] ] e e g g _DEFGHIJKNPQRSUVWXYZ[\] !#%+-/139<>@    ; Q [ ] e g ,}$$%%&'))**.. //22334466779: ;; << == DD EE FF HHIIJJKKNNPQRRSS UUVVWWXXYZ[[\\]]          !!""##$$%%--//3388 99:: ;; <<== >>?? @@22        ; ; P P Q Q Z Z [ [ \ \ ] ] d d e e f f g g  mm}}      $%&')*./234679:;<=DEFHIJKNPQRSUVWXYZ[\]  !"#$%-/389:;<=>?@2    ; P Q Z [ \ ] d e f g  mm}}         p$$&&**--224466779:;;<<==DDFHII JJMM PQ RRSS TTUU VV WW XX YZ[[ \\]]           !! ""## $$%% &&++ -- // 33 8899::;;<< ==>> ??@@ 22   ; ; Q Q Z Z [ [ \ \ ] ] d d e e f f g g    m}  YȻ!gource-0.54/data/fonts/README0000644002342600234260000001033114362112040015477 0ustar andrewcandrewc-*-text-*- GNU FreeFont The GNU FreeFont project aims to provide a useful set of free scalable (i.e., OpenType) fonts covering as much as possible of the ISO 10646/Unicode UCS (Universal Character Set). Statement of Purpose -------------------- The practical reason for putting glyphs together in a single font face is to conveniently mix symbols and characters from different writing systems, without having to switch fonts. Coverage -------- FreeFont covers the following character sets * ISO 8859 parts 1-15 * CEN MES-3 European Unicode Subset http://www.evertype.com/standards/iso10646/pdf/cwa13873.pdf * IBM/Microsoft code pages 437, 850, 852, 1250, 1252 and more * Microsoft/Adobe Windows Glyph List 4 (WGL4) http://www.microsoft.com/typography/otspec/WGL4.htm * KOI8-R and KOI8-RU * DEC VT100 graphics symbols * International Phonetic Alphabet * Arabic, Hebrew, Armenian, Georgian, Ethiopian and Thai alphabets, including Arabic presentation forms A/B * mathematical symbols, including the whole TeX repertoire of symbols * APL symbols etc. Editing ------- The free outline font editor, George Williams's FontForge is used for editing the fonts. Design Issues ------------- Which font shapes should be made? Historical style terms like Renaissance or Baroque letterforms cannot be applied beyond Latin/Cyrillic/Greek scripts to any greater extent than Kufi or Nashki can be applied beyond Arabic script; "italic" is really only meaningful for Latin letters. However, most modern writing systems have typographic formulations for contrasting uniform and modulated character stroke widths, and have some history with "oblique", faces. Since the advent of the typewriter, most have developed a typographic style with uniform-width characters. Accordingly, the FreeFont family has one monospaced - FreeMono - and two proportional faces (one with uniform stroke - FreeSans - and one with modulated stroke - FreeSerif). To make text from different writing systems look good side-by-side, each FreeFont face is meant to contain characters of similar style and weight. Licensing --------- Free UCS scalable fonts is free software; you can 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. The fonts are distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. Files and their suffixes ------------------------ The files with .sfd (Spline Font Database) are in FontForge's native format. Please use these if you plan to modify the font files. TrueType fonts for immediate consumption are the files with the .ttf (TrueType Font) suffix. These are ready to use in Xwindows based systems using FreeType, on Mac OS, and on older Windows systems. OpenType fonts (with suffix .otf) are for use in Windows Vista. Note that although they can be installed on Linux, but many applications in Linux still don't support them. -------------------------------------------------------------------------- Primoz Peterlin, Steve White Free UCS scalable fonts: http://savannah.gnu.org/projects/freefont/ $Id: README,v 1.7 2009/01/13 08:43:23 Stevan_White Exp $ gource-0.54/data/gource.style0000644002342600234260000000044514362112040016041 0ustar andrewcandrewcchangeset = '{file_adds}{file_copies}{file_mods}{file_dels}' file_mod = "{date|hgdate}|{author|person}|M|{file_mod}\n" file_add = "{date|hgdate}|{author|person}|A|{file_add}\n" file_del = "{date|hgdate}|{author|person}|D|{file_del}\n" file_copy = "{date|hgdate}|{author|person}|A|{name}\n" gource-0.54/data/gource.10000644002342600234260000003221414362112040015040 0ustar andrewcandrewc.TH Gource 1 .SH NAME Gource - a software version control visualization .SH SYNOPSIS \fIgource\fR [options] [path] .SH DESCRIPTION \fIgource\fR is an OpenGL-based 3D visualisation tool for source control repositories. The repository is displayed as a tree where the root of the repository is the centre, directories are branches and files are leaves. Contributors to the source code appear and disappear as they contribute to specific files and directories. .SH REQUIREMENTS \fIgource\fR requires a OpenGL capable video card to run. .SH OPTIONS .TP 8 \fB\-h, \-\-help\fR Help ('\fB-H\fR' for extended help). .TP \fB\-WIDTHxHEIGHT, \-\-viewport WIDTHxHEIGHT\fR Set the viewport size. If \-f is also supplied, will attempt to set the video mode to this also. Add ! to make the window non-resizable. .TP \fB\-f\fR Fullscreen. .TP \fB\-\-screen SCREEN\fR Set the number of the screen to display on. .TP \fB\-\-high\-dpi\fR Request a high DPI display when creating the window. On some platforms such as MacOS, the window resolution is specified in points instead of pixels. The \-\-high-dpi flag may be required to access some higher resolutions. E.g. requesting a high DPI 800x600 window may produce a window that is 1600x1200 pixels. .TP \fB\-\-window\-position XxY\fR Initial window position on your desktop which may be made up of multiple monitors. This will override the screen setting so don't specify both. .TP \fB\-\-frameless\fR Frameless window. .TP \fB\-\-transparent\fR Make the background transparent. Only really useful for screenshots. .TP \fB\-\-start\-date "YYYY\-MM\-DD hh:mm:ss +tz"\fR Start with the first entry after the supplied date and optional time. If a time zone offset isn't specified the local time zone is used. Example accepted formats: "2012-06-30" "2012-06-30 12:00" "2012-06-30 12:00:00 +12" .TP \fB\-\-stop\-date "YYYY\-MM\-DD hh:mm:ss +tz"\fR Stop at the last entry prior to the supplied date and optional time. Uses the same format as \-\-start\-date. .TP \fB\-p, \-\-start\-position POSITION\fR Begin at some position in the log (between 0.0 and 1.0 or 'random'). .TP \fB\-\-stop\-position POSITION\fR Stop (exit) at some position in the log (does not work with STDIN). .TP \fB\-t, \-\-stop\-at\-time SECONDS\fR Stop (exit) after a specified number of seconds. .TP \fB\-\-stop\-at\-end\fR Stop (exit) at the end of the log / stream. .TP \fB\-\-loop\fR Loop back to the start of the log when the end is reached. .TP \fB\-\-loop\-delay\-seconds SECONDS\fR Seconds to delay before looping. .TP \fB\-a, \-\-auto\-skip\-seconds SECONDS\fR Automatically skip to next entry if nothing happens for a specified number of seconds. .TP \fB\-s, \-\-seconds\-per\-day SECONDS\fR Speed of simulation in seconds per day. .TP \fB\-\-realtime\fR Realtime playback speed. .TP \fB\-\-no\-time\-travel\fR Use the time of the last commit if the time of a commit is in the past. .TP \fB\-c, \-\-time\-scale SCALE\fR Change simulation time scale. E.g. 0.5 for half speed, 2 for double speed. .TP \fB\-i, \-\-file\-idle\-time SECONDS\fR Time in seconds files remain idle before they are removed or 0 for no limit. .TP \fB\-\-file\-idle\-time\-at\-end SECONDS\fR Time in seconds files remain idle at the end before they are removed. .TP \fB\-e, \-\-elasticity FLOAT\fR Elasticity of nodes. .TP \fB\-b, \-\-background-colour FFFFFF\fR Background colour in hex. .TP \fB\-\-background\-image IMAGE\fR Set a background image. .TP \fB\-\-title TITLE\fR Set a title .TP \fB\-\-font\-file FILE\fR Specify the font. Should work with most font file formats supported by FreeType, such as TTF and OTF, among others. .TP \fB\-\-font\-scale SCALE\fR Scale the size of all fonts. .TP \fB\-\-font\-size SIZE\fR Font size used by the date and title. .TP \fB\-\-file\-font\-size SIZE\fR Font size of filenames. .TP \fB\-\-dir\-font\-size SIZE\fR Font size of directory names. .TP \fB\-\-user\-font\-size SIZE\fR Font size of user names. .TP \fB\-\-font\-colour FFFFFF\fR Font colour used by the date and title in hex. .TP \fB\-\-key\fR Show file extension key. .TP \fB\-\-logo IMAGE\fR Logo to display in the foreground. .TP \fB\-\-logo\-offset XxY\fR Offset position of the logo. .TP \fB\-\-date\-format FORMAT\fR Specify display date string (strftime format). .TP \fB\-\-log\-command VCS\fR Show the log command used by gource (git,svn,hg,bzr,cvs2cl). .TP \fB\-\-log\-format VCS\fR Specify format of the log being read (git,svn,hg,bzr,cvs2cl,custom). Required when reading from STDIN. .TP \fB\-\-git\-branch\fR Get the git log of a branch other than the current one. .TP \fB\-\-follow\-user USER\fR Have the camera automatically follow a particular user. .TP \fB\-\-highlight\-dirs\fR Highlight the names of all directories. .TP \fB\-\-highlight\-user USER\fR Highlight the names of a particular user. .TP \fB\-\-highlight\-users\fR Highlight the names of all users. .TP \fB\-\-highlight\-colour FFFFFF\fR Font colour for highlighted users in hex. .TP \fB\-\-selection\-colour FFFFFF\fR Font colour for selected users and files. .TP \fB\-\-filename\-colour FFFFFF\fR Font colour for filenames. .TP \fB\-\-dir\-colour FFFFFF\fR Font colour for directories. .TP \fB\-\-dir\-name\-depth DEPTH\fR Draw names of directories down to a specific depth in the tree. .TP \fB\-\-dir\-name\-position FLOAT Position along edge of the directory name (between 0.1 and 1.0, default is 0.5). .TP \fB\-\-filename\-time SECONDS\fR Duration to keep filenames on screen (>= 2.0). .TP \fB\-\-file\-extensions\fR Show filename extensions only. .TP \fB\-\-file\-extension\-fallback\fR Use filename as extension if the extension is missing or empty. .TP \fB\-\-file\-filter REGEX\fR Filter out file paths matching the specified regular expression. .TP \fB\-\-file\-show\-filter REGEX\fR Show only file paths matching the specified regular expression. .TP \fB\-\-user\-filter REGEX\fR Filter usernames matching the specified regular expression. .TP \fB\-\-user\-show\-filter REGEX\fR Show only usernames matching the specified regular expression. .TP \fB\-\-user\-image\-dir DIRECTORY\fR Directory containing .jpg or .png images of users (eg "Full Name.png") to use as avatars. .TP \fB\-\-default\-user\-image IMAGE\fR Path of .jpg to use as the default user image. .TP \fB\-\-fixed\-user\-size\fR Forces the size of the user image to remain fixed throughout. .TP \fB\-\-colour\-images\fR Colourize user images. .TP \fB\-\-crop AXIS\fR Crop view on an axis (vertical,horizontal). .TP \fB\-\-padding FLOAT\fR Camera view padding. .TP \fB\-\-multi\-sampling\fR Enable multi-sampling. .TP \fB\-\-no\-vsync\fR Disable vsync. .TP \fB\-\-bloom\-multiplier FLOAT\fR Adjust the amount of bloom. .TP \fB\-\-bloom\-intensity FLOAT\fR Adjust the intensity of the bloom. .TP \fB\-\-max\-files NUMBER\fR Set the maximum number of files or 0 for no limit. Excess files will be discarded. .TP \fB\-\-max\-file\-lag SECONDS\fR Max time files of a commit can take to appear. Use \-1 for no limit. .TP \fB\-\-max\-user\-speed UNITS\fR Max speed users can travel per second. .TP \fB\-\-user\-friction SECONDS\fR Time users take to come to a halt. .TP \fB\-\-user\-scale SCALE\fR Change scale of user avatars. .TP \fB\-\-camera\-mode MODE\fR Camera mode (overview,track). .TP \fB\-\-disable\-auto\-rotate\fR Disable automatic camera rotation. .TP \fB\-\-disable\-input\fR Disable keyboard and mouse input. .TP \fB\-\-hide DISPLAY_ELEMENT\fR Hide one or more display elements from the list below: bloom \- bloom effect date \- current date dirnames \- names of directories files \- file icons filenames \- names of files mouse \- mouse cursor progress \- progress bar widget root \- root directory of the tree tree \- animated tree structure users \- user avatars usernames \- names of users Separate multiple elements with commas (eg "mouse,progress") .TP \fB\-\-hash\-seed SEED\fR Change the seed of hash function. .TP \fB\-\-caption-file FILE Caption file (see Caption Log Format). .TP \fB\-\-caption-size SIZE Caption size. .TP \fB\-\-caption-colour FFFFFF Caption colour in hex. .TP \fB\-\-caption-duration SECONDS Caption duration. .TP \fB\-\-caption-offset X Caption horizontal offset (0 to centre captions). .TP \fB\-o, \-\-output\-ppm\-stream FILE\fR Output a PPM image stream to a file ('\-' for STDOUT). This will automatically hide the progress bar initially and enable 'stop\-at\-end' unless other behaviour is specified. .TP \fB\-r, \-\-output\-framerate FPS\fR Framerate of output (25,30,60). Used with \-\-output\-ppm\-stream. .TP \fB\-\-output\-custom\-log FILE\fR Output a custom format log file ('\-' for STDOUT). .TP \fB\-\-load\-config CONFIG_FILE\fR Load a config file. .TP \fB\-\-save\-config CONFIG_FILE\fR Save a config file with the current options. .TP \fB\-\-path PATH\fR .TP \fBpath\fR Either a supported version control directory, a pre-generated log file (see log commands or the custom log format), a Gource conf file or '-' to read STDIN. If path is omitted, gource will attempt to read a log from the current directory. .SS Git, Bazaar, Mercurial and SVN Examples View the log of the repository in the current path: .ti 10 \fIgource\fR View the log of a project in the specified directory: .ti 10 \fIgource\fR my\-project\-dir For large projects, generating a log of the project history may take a long time. For centralized VCS like SVN, generating the log will put load on the central VCS server. In these cases, you may like to save a copy of the log for later use. You can generate a log in the VCS specific log format using the \-\-log\-command VCS option: .ti 10 cd my\-svn\-project .ti 10 \`\fIgource\fR \-\-log\-command svn\` > my\-svn\-project.log .ti 10 \fIgource\fR my\-svn\-project.log You can also have Gource write a copy of the log file in its own format: .ti 10 \fIgource\fR \-\-output\-custom\-log my\-project\-custom.log .SS CVS Support Use 'cvs2cl' to generate the log and then pass it to Gource: .ti 10 cvs2cl \-\-chrono \-\-stdout \-\-xml \-g\-q > my\-cvs\-project.log .ti 10 gource my\-cvs\-project.log .SS Custom Log Format If you want to use Gource with something other than the supported systems, there is a pipe ('|') delimited custom log format: .ti 10 timestamp - An ISO 8601 or unix timestamp of when the update occurred. .ti 10 username - The name of the user who made the update. .ti 10 type - Single character for the update type - (A)dded, (M)odified or (D)eleted. .ti 10 file - Path of the file updated. .ti 10 colour - A colour for the file in hex (FFFFFF) format. Optional. .SS Caption Log Format Gource can display captions along the timeline by specifying a caption file (using \-\-caption\-file) in the pipe ('|') delimited format below: .ti 10 timestamp - An ISO 8601 or unix timestamp of when to display the caption. .ti 10 caption - The caption .SS Recording Videos See the guide on the homepage for examples of recording videos with Gource: .ti 10 https://github.com/acaudwell/Gource/wiki/Videos .SS More Information Visit the Gource homepage for guides and examples of using Gource with various version control systems: .ti 10 http://gource.io .SH INTERFACE The time shown in the top left of the screen is set initially from the first log entry read and is incremented according to the simulation speed (\-\-seconds\-per\-day). Pressing SPACE at any time will pause/resume the simulation. While paused you may use the mouse to inspect the detail of individual files and users. TAB cycles through selecting the current visible users. The camera mode, either tracking activity or showing the entire code tree, can be toggled using the Middle mouse button. You can drag the left mouse button to manually control the camera. The right mouse button rotates the view. Interactive keyboard commands: .sp .ti 10 (V) Toggle camera mode .ti 10 (C) Displays Gource logo .ti 10 (K) Toggle file extension key .ti 10 (M) Toggle mouse visibility .ti 10 (N) Jump forward in time to next log entry .ti 10 (S) Randomize colours .ti 10 (D) Toggle directory name display mode .ti 10 (F) Toggle file name display mode .ti 10 (U) Toggle user name display mode .ti 10 (G) Toggle display of users .ti 10 (T) Toggle display of directory tree edges .ti 10 (R) Toggle display of root directory edges .ti 10 (+-) Adjust simulation speed .ti 10 (<>) Adjust time scale .ti 10 (TAB) Cycle through visible users .ti 10 (F12) Screenshot .ti 10 (Alt+Enter) Fullscreen toggle .ti 10 (ESC) Quit .SH AUTHOR .nf Written by Andrew Caudwell Project Homepage: http://gource.io .SH COPYRIGHT .nf Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . .fi .SH ACKNOWLEDGEMENTS .nf Catalyst IT (catalyst.net.nz) For supporting the development of Gource! .fi gource-0.54/data/user.png0000644002342600234260000017232214362112040015163 0ustar andrewcandrewcPNG  IHDRbKGD pHYs  tIME+04ct IDATxyYU'[)ˑ̔pj jáT*QK-,:"p.TZJҠ 5AQIZ4iÖ|e^krZ{w5oD4 l/MIx8r0:`{{[-V R҅@@d .^^3Ο?sٳx܅ooƇ ,/Ǘ}8r0ߏ̙DڒjjV)eYֿ‚X׸p@qE /=s;;or"Y{S_ǩ+Ⴧd*N^ R.Qp+BSy'@ОoЂ$LZ|"RJX׸뮻(?aOL{ӛބcǎ+#Gx-`@6q:bt,WVZ#W9 IwZx^= "][ގԧp 9|0`ifO,~09JD `}%ngPRI;w}7pǎŭފ%qфEGG8|0СCo>4Df$a1gg%0 GuₑJT ܎eUΜ9x;}Cx _QXc/}KO?ѣG^XVʤ]uDGOi'B#XGiW 9O!@*Yj*Ο?3g>O~\Xav/+DJ$+23I%!ДAi K. dҞ( V :Po/)m݆qE=vM7YzN8!DT͒|YPTئ:DlLgLJ'gpM/*cP2@~m&9Ékk03Mm^X^N lVFiϻ@P|Г)X'Xc33 A@<˕s9'bX~~?I8|򤤔c2N{_.1-rOS#CÌUA  ~ P;QFgN@ H0UDOӡqE{t]zۇȁ ]~qʼn1|%I 1c~@Ҩ* $$Z)ibcd12je]s/Ο;Owu'X"=2vo B UPTu4]$h%wK 2iOgp P3~@2yp_Y2w?c8t۷5wB"B;OucS3+]`ER"*$v8V:esmFsyJ$&ڜ@fRǾΟ>/"=<]p r_jn~/tRZ K @XtA;c(˧̝P t?s5s;7ng$ժ {}7~o|#!.av뭷ꫯ뮩4yB<>' 쓁>6/*^1&9Ia Q6U{=?@<&L@_ Tjj]-CAlp>Ӌ^Ca&_oa>S49tPp7>u^R=}hc0aH`"NV$%/36X[OcA/2n~?]\a²ފN<)sOy/_U A>:%lzK}rOAA|hA`0JӸF'7}~~rK\aOp ٿuDSO2y*`8 Kda>`i9q]mWzՀ< q@F8J"s_s$";}cMh{paٷ 1J×&}ڝhwyd`2&̕irhNz;Gᴅ M={9zlWOMy|DVUk@ +/0U $VRLe Jf/<9}M7 m[;L¼^Ei.\^+[y"E?S|W5W_}5>"LC&/LOb _zdzٿ;,jCB2'G[jogN;|"%?s|~)n\s5rʏ/RrӼDznl{XqC=ӳ{rD.2\ 5T>M l/}݇'N[oʼn'd{{9vGlÔ0fX JHnUq~=wP +V8dki0ZK_>swuV|{N88rlmm؞ q=?'MM'hV. +`@pExe3*)%0T0tf}}%*E hcHߑ+c"'l[q;uòU콓4>7u߁W6[Y JTgyÞ{,ǎMo|qQn³l=ze֙(u6D\$$柳x#>g Y3~ eVOC>a^'̧v1xg g>~G~$.awرcS_&J P9mo 2Y-{kLi,˼#fm0,x'>Ac{އǏr^T"QgJIP28yH@,ym/Пk Mgߝ`{{7xL\/{SR#G$ =yf罳&d:kP c_m]"GWӎ!忷@t6lۇnA^<.a~x_);2|5![ͤ + ,#AV=  rSm׿Oo&"=gg8p@vfdD!| P֭JlP# ٠A|jdMŘS(`5a%KDp!|?J\C{׭۷.;q*M[Hkէ4aԙ 7W #wГ,&I@Ju 4G;v {㶊`-܂ǎÇvK/P!*AG%L>Ɲ&`}NLôH0/Bd ~9B8p;G`\Q=k++CNk۬s;Vy[C e5S= *B[9ϙ 3>~+YzwN\i_e_*=A9> @t1j|NtN5?OK`-U֒xThA vJPvV+kǡ (_-ӵ;|!۹48]v7ƪs8/u.srnWr)$O6~=ށ&qꡇ§? 쑰z=8/i>LriO`VdLhHl_?Cؿ_(%w@uMazXسKo"%]F {w4q˴F0) S%(8v8N?pZFַco 9/ܮ:e^| (r>3:_|hc=ĿJ҆ *5|("}vUWC-" 4ӣ {АR֞T_M_duVw}P &;<(d Db>Z'=I^?{;ށkFjCvOQP=.VV9.!ΉQ uk(64kܯ sQgQ)u^=)F2>׭ĸ5]>Az^GTabkVųWr /,q}|vv@Fe զ|z2' dx)T*!}g]\wuqqD?"ӻɡgg!C!  l~s+_tL0o5Q 1h!aS]W2.a;c{{"|7Og*87 h{KB`*<;k@8 DubMP m0sɓWHMX#4s+]"~X5~)L 4jhT.(xzh *-E8z(>."7\s4L?gl3DZ}w D3d9|"4 d }Zo2 +f' vmqqDoVs=Y鍦3 ۍdCLDs-|hC"!~DitCcYʉV ]{\qQD+'r+/Ujwݦ=t?6 Mil;If1O&eCt2;jcC1 LlۇeqADo.áC"QBaTCbkWCAC:=4MSN Ͼ 2%-\F⏟,& jhSV N?.??GSNԩS"]`cK,]8ڣ[ua+B*YX;\Bwi8MMa Tlꫢ\@RJpROӰ ,Oiv> B0̦Q)C )Z?W%kַsdž]毲C31lU5Ƣ{6]]0HfU 4"9o'M= `k©S' $&µOzR/ ,`| zBq;eCcYF+\Ue(L-pqDx-xгb <6΁a} *C=Ta"%DRr &l8,yk2ıW\1m9YZL)X.pS;۽hc-Xv pO<|"N<{ J),~R5|Đy1J2LK@KHcc3[ɋ ^믗'Nu򵷼-ڒjMI!oy6T:g]Ë=_! .Q+б`c9@:t??JN8=&_`gZAziI]+R],'24'Y($UNV†F/ISh CKv9$2w75U,TXyH9EoVdgބc;Y Pb#HUmY!$O6.WUq8n\v*$G@zUZ"%yM$`[38qN·E'~Ǖ#S_?,f\ &ID/`WgR5,eFa<;a$S5H @J Hbp}CqE{oD,P=7{){*lr"]E IDAT +&ed?EiS\\I ^NVHW_Wzg'O snf,,Ci_,=L3Gvj,W|7̛I.>pI<"2P6!U{ kWu`oOOᡇRNg]YaS3Y0"IXF pOё2߶+&xnԝMO>OZDHX/,HTvM6UDfhHj{ /~bwBzfdy_BU06BKi~ݭY6{ze ~x+mo?gm̚`3Cdz:E@)J?42XLB1Oz\J?~77q!?#3E$-l7PQdI{pCPmM ^y>H;^drLۋ_M:N"]5 YԕWe`oOt>U"jAoRwν *9$l:ߗ4޺r_~Ь0T Sד,5}DG<@^HHe= c`lV-q1E?[V/or4}KBxF|LwY@ k|YvYl .|Ddbei9g'a'!q>el&Q M W~Wĵ`UW]j9/#_̍&Xl숻$P` D`CF貘V( dpqiGDgƉ˄ѷ -tcYKܿtT2\9 )!a@DWyR(' p,(C ]JKE`۝)%CԔmh} cy/b:?/f0ټMűkN S&AeDX֒y*E$1uIv<@`k+G8G<' E 0Qa@k /P&b9ʺВk֦AVِ| קX[D~>X|_%qqEvqȐw5*4(DzfhQO <9URߜeE2@@Ϸ0bLMb@ʊ*\VW_UmA&ƛ([fˊo fgYMsyXPSز 9󻶄\!BIP|$]ɹ~bf݉ArСqEؽW X%iR" <矧 >f'W}%^-0ceV8<\8Ǔ%8uիH `a|L ʧ&tBJ1LDx:t]kW]u/PM7;dYE3=?d2s\ _yéy}Ξ‹GLTW 쟒oad38Km{{_͛~CgWջ]ܴl{q0 wnˑE2y-`/ovؤd=pVmB{EFN IęI%2LsbAHH+ '`OθE ~zS&xX#-9N {u+`|y b37:;\}Ä!OCs|93H?΅U/H1SJ=@"N' ₋w8Ryu3B<]sa')H/́ 7^?sr,bl %R41Mϓ+G5}X}uQ+9?짠甄+4|/x ҋY6γPE'$b,kˌ.aW!wiC&ߥ//j/N[ lO/· H2"/R!s6IR` 1N+SH4fY@/1.{ #DcA%7Q㧩r-ynS_$`}rXnY|YBNyCXܿ-S/s.ߨ5 65(*i  G: D5TBV±#"{a%nlM JS˚C:8Iю$ȍ(?~c̄٬ ( .h/o +/SYxܗҦaXE6{Q<ĭ(&$%Z҂64ӳO:K V8|P\vif'5ɋ;_N N\ĆܡI0bt2Tg;B~4l)>r!8Mw6 dC0MxNZvH)TpSA";k^%]!@ :c!)бFCdU};5XUVF Su:;l=ڑ(XS-B1FX8)MX|?p^_)6 "h׹k1u[b2J=;Ș5CHby6(W-dtP&g0S$^JuLO+PT螵'\5\`lPfQZ#^m`wS9`wz'͙;a뗝4e0y8'tOw vv4;Kz5a[2ŅCdgѭ.^wE9OSv~[,RERYF$33l_ uOqJ?IW,u1E1(3jcr =&Xd'm(2_y ;Eӝ0Q1Iz~Aer8,o+[&^:ZĴ.M'6$3qA4pW2뵬TY:p#Hߋ9rY 6Cc)<ؕœ{.Xj ( C NZۡ "9ipaK衈",& 7jIBqE\mO=9vqbos[j-Gv`d/zefp**dL)oټ7.&!@>B"`vq P9F[0Cb7ܴtL)j"9 N[&{ZmOdP}(݆8 $hS Z鑲Խjݳgs3B:&IY(X\Q]'G`7[Ӏ祒ꑘa?yr2#Sw=A@ 3pwuV=y)Iݞ~8n*+iRzaaj]O SwJ* )?Q4Pɏf &U]L.a"MA65MS_ÎXtM4Xm%[]M,CKd2a8֥gsry#`1$uT"dVI]ZQD2Ň4[?tyl ۊ"I[$Lef!=UyuFKt*c"et=VW>Zf׽q!6SC,2 C?`0&: JM'LPEWg$gy1J2 v^5'vPMvj:H$>uPQQ~JU"uR=ZT2+E?R@`Lo62ӺDUBJ eFfT䂀 *Oyu6䏹_~;Fdd/۽2ф2Nݿ&գخb3;P=n@jEVJD au|Ф $AR/MJ*/8P |4$01_Z hNd=/b4,/AA3ek;k n4QunFi[eC|Ux|~?Sg殱#-[#yҍBya߬pKdޓE8f%ak*jS]. {T::MT44.p9X0T&5 Ddz]WfIdL^a**g8f`*.Ue9~^/dss'|67yY 35T6O?x&$FCn+ A7u!!VeK^jJSƇty%MU::Wy5v' (/ 2b3LubL)f\]^g& Pz#M=Z:S< xAAlc">v髄! nM1x,VQG>gֺLħ"/ή?i^oI @E2%tt=&((G ,Y9C?oWVTRușLKu%+bPu4,1}t͒>B׍ïN$:DmqsdVr£yNNeK v] ee.Ë`âpa/@nKpS兩sD$fH0_%j,/2e`/%[-JQrh@`/qD؝%XwGlNHqLf߲8nHBɦ[Sد$m[gfRWÆX/_-Omv*S"`} Owٰdg#2WFL;6aۧm06QvȞP&ʭHUdXJ\PYF&d|IRr `3gNaղPdJŒ[[Y=O-قM@*$YY{#PJcH-,jhZl"V1~+Gol" 6{3iЛC. ad6U;NvS <R&H ˘SB"U"E+Ҳ.%]RB?/wC ^w8P>Km(KI#O{( in &%@Qpy:h4/w&Z˙޽#5NCʗa!ИX]k8Wd?l& B2v8JDZ砚Efq˛RU1wpT/!Z_9pRfh1RnJ.#BJ,kxM񏅯;?֌UZ)ѳC͗,siR,|O6akSКε()^|&|V4W _#胛WΓWX'Kz= UM,oӫfZMo5P+V|nϮx5Ҿ1=1R~ ~g<A@L@#I_艤&Jڤ _ g`B@k25\orK!d,}DZ =7 BQeLYסB&KtS&uh<)zA S4k fCg/ʲU,td2f2wxѣ쒘55V\[\}'$F#Y?y6,  IT>& طW Kl_51R}GHE.ŀڛ_-!t^p$rMyX6uN&+$VBRz15#aJFpPi̶ىIb/fY"LSWl@$ =Sd}<AY:#^RlUB4}{d† M $jGM+$_ JCe 5!KvuqpV;NeHlt5s9'4ڝ:ix'DAw7xwRjPʋ \ު.cA0r]/``vʰ3NV$7dXGi+1E;sZ,Ѝ[c[ wUqp4v>}=* ԰oud Ij+d!h`*,Gj\V$v ʠ¶&t~qgP } Dږv,bMgi*SNbYWWB5neyrTɸwvY>~ wǘcldawm? ֦Ka8fAU&UնM p* $0(ASs㬣& J7>0q·V #Np4v}ⓟlZ+V[y FdF-Ȟ3k(ڠd%TQ1V4ިv 9.dC0جzahE lSv C. ԧOt{ $}tjZIV HHsu QUMyjԶ+,)mY NyMdJWυ;_J8I~Ru:l.YjcqwkF,⾃0pble:+fNAO&<.1**N-faދtzX[&y(v=\^PQ|rN_~ T,̺KXs(8NDKD2*LBh¾/Lv=9:tԦ-hA;3#@{^*CG \oTjಶ2t:_΍4r` uNsӈ)sQ=`V0Ơ08!6ð`xDtlfi!~m~z9q 2PacuAl[)7sQ8̮HSb&$YmH"n}'!:Tghmpzqp.`T(ۮRY6wi@$NW:|kT@BM譜 il#m8'OdZ 汙f.^p\1L ۈL X ` &ؾ,({2& 11f1nB` `,UL*Lz>Bե56d'5YQrapʱlJi%fq8Osy-hoV.{Lъ]f/^w~sz*4":Ü;ف+z od}K,Nfy*oflc?/4y/+Rc3_X^y ZGFƢziG瀖f V:O&t2sVe1 dSus()1.&g3я~4J@@{nA$U7Lm6e|Hl$ݘ E섦ڹ ɞ! f 9yAENU;:NEBݛ1o,5]sC<=4?^˦ݥAa1, \lJLLT RU՟SvIU[s7A+^GY;.^oƀcO}/\i1ӳJf3K1;]ũN2j=gE-5tPg. dq8Uk}?9.8Pr]|f#Zg[`ڰ~op>W ̠T`?j=TX{J$8dHdZ1%ՏFXҙ 0@F*23Zɔ p=7ꖤMcJxqaYs'yC*F T`pa[yOQt 1l& G o l"Q Оx5h(}FÇ &<M¼d*`.G,쁠O +%J%K$+ "=<|Hn[\}oG؃XF:ea&b6#-4Q(.S$dyJw:\qbN L^U3/5P٬[ ˬ` <&pYK)9`mi& F}|rZQUk(V-=w- _da# ~o03-j0 ]6,iN-!PG\DUa&H^卍tCEçfJTS#n2z_(3#j{̙P},Gr24 M~o:@fNr8OHO&R~MV}:HN}EdAHQ0.ڝbhA2ގuasS`׊dzPYu[$BLڧL e}DO=2H gΜٳÁD`o;_/Nqݳ/XLm2sE9LTT>|=l\3_`A?ZĭĬ4I6[f= )ٕ) C~˸UuWDXfY[~~HSx9̂J &VTPHY?-MUy$TNbɺ}B,"D+ɾ ps?7e)9HhDM!UfgmB33'CgR20"ԯ#.ZZ6B78'L7~ݶ[h,+- Ս5m*[@nzSPl>>i] &AF~yƘ/⡇sp}>F__.b/9M#+qLIRh*]HC{} @e3W?5Ub>Xcyld,ܴ`8b^TlɌ8•۠2 {c !qDk"&\)Mm5Ѩ#T\-Ank4jgJs/=yO8V<:vwkk~|k{e.hKG460Ohҗ22 9Ah'3_4.f޲QS=_ԓ^㇥벗h]3H&XA:Zo76?ndzm͢?"3KV{BFUlkjTɲͥk;ܓVbvZeZn?It<3_@M8. |򓟤g<†_n—e*\s"()g XiGOd4+!fI%jp>xN0)\:bH+ťU|gp[fk薕  ߾kEh]JYA4pE4;Q= =VRQ'zXwT4,!U,t @ZE"F./{ f}My@M؈|F_wM|we[nd% 2/.8@DMYI0tDor^&ǖ%S| q1{Ln?*`Af6o5V)zf'+?J=gv;?J]w˸k-vEjR, plr ߺ>a15iiΣ3֞(5NK#z2 ]p>aVU<T[YWUf6˲Q=nf X`|ϳ8i&Z!GJsSz_ rd|i_Ɖ+Ivm[2W-?U ,"Zsx94M/3GߏQp1ͼ3qA=8N/hIW\*6rNIҠ [H< WvT'y (ς$ &rBk~WN/׉29||sdQ\Un3Et a [V5@5DmsV9eJԘ:R1&7o`$v0S,j6Y eV,=<۷ڸLX9?N~ҷUaa`&svP:gryHIZ[}"ԩ=!QcƤ3wUGQlџ`TWGImpQ\Uk_ǎ XB5`4ZX5O]n32*њxk a#.=Zp>[7,kx1KZ}>XRβXqbXsWq~ T]HۭyR4A{.׆  l*vq~Bӯ:} z-&{k0x,ʒ*-kck$wPTͽ1*z@kTey|%]_L\NWp8Ѣ ӟ/Olssd9#f""h Xk6tNɧ 4uKH&wD"\f_jY*UX3K'=c%_=6HgO嫑*Hbl I]eg K0 啐Dr!i?iz?ّBGRavD[́3gx_r[BxdJRKa]Akz-9S0|)U&]ZgNRLebjfɻ]dѰta2z3=KbHɉF L=N4L'fcAy!Khl}kBٙ-ȚTBF7b,|q=пW2.<~*vlqzHj"ǟeaG_ḥ8e\]g.ke_{V;.5e`jc\ ׾Y,*L6]}Gwuk 3q1<4Tn1 _-R{^Tc0*SHR:k=G^_u]+ }.^4͍xZ 2>Ǝ~9YPj6ϋq@ eLCN;ABùuq{d= i(P.覮ϧ*+55sQ?MjCu"q|ⓟN`X8*э!: P%|N"Ֆzs B[F;H TMI̸f oޅ7rjp,;a _UXrv(c+p9/1y ^uC" i rhR4a`ze`Iٓ{JmqmSgpF).˲YP[]W@RG}e\Nm TN54TJJ 'ܞt<1CWxi]R Yq1js1W Z\Y釷k:6=ubk0k֬ \xu~ Yl6r^cd_#p%}'W>'DXy5ERj|D\, (1ǒ/o\ʥ*cGG %y{^򒗄@Xꪫekq\4}6BV ԋ3-n}D8ҦK @NW`<˯i/3Y٩"+s)4{`W沞QP$չRYf6FIL"K/Tgj(FUFmty/@g~k¬[oŅk]djU&]Re[ ;8s5LpC눖eO3,%ǗRx%ѱt/]زY PUH: ^*)':I젖%J 6W {,6llMi{۾;Ǝ Rmo{>7C BN:UʾD ,%Y4Gv}e+e eC"jwGyf><Zv)> @WaF6[]|sC:o~ Ul[U)YYVh* TKZQ5z *ìVT}!J )eD(ut}M@õ_,þչ۠D0!7 [*a IDAT趼- [߶ɣfQ)2a$d'yKBSkrw:q>r4݄>B3_",:y[AT3"rb|+($Z&ajy*A`YCq3 )]fGE[⊓A; pkVtL PP^s[h`@@;:Ya^*b;0ʗg6t;daeʺDX%o~RYǨRuVʡ'"L]j\)s h\@#(,U'Vʈ!2ЁA:F)/_ ɛp734@Vj.5)Q"f^ 8]P"O[` J=T ~օqS?^0WcP*) ՠn2fK [ \7vJSws 5^_-lON/z/1)0)"aL!\![sR&M_G;|3:1;u`45p)l6ylqj~5AiT(X"%rf͢ɥ]LNnS!3(֯N>ӁBuN[e(%_@ZTI ̶甝._L:% ż ]*{nR[RnpKqRT7Uŭlc}&vkmoRV3&]CZ㧤9ұi-1i"D8wpQ=_8yph6P,$QreˍebuQ @)clNK h@0 :zt#OMPR}E'l!hV gc[@jpq}^WӍM~B ؽ'I{J7Oq'ڨ>g:[,Kl9y0DGyjH&!l}KךP$5_{׵BS6n|9@rV4 4N۝*d<_,<ʯʼAg}_-o[.,I{Yى4p¡x}gWMcog zdYU}?tW9Qbv +%"-J5$ K|3Z,ܚ~DtIRn k.Z{se:\Τҍ_]Y5^y}6Z? 6G<Ə~! 9>^9"8H1+m-14%=n"ʓ뭄 x&keS3xȍc546E>#׊UCY1nӃ$̽j>T{늛L¸ BfUrZ:,uz-Ρ_z% 5WspJSc7u3'/Wdlҥb-~:XЄ%W FF[͋_G"A@s_1gukؿZF4VC5ے@fUfV}@X;5 af`4>o x 6\;jYu"W5"4{ в$(d/BJ>?3F0/7ތsםsV;JiZBwj: VKa^+RUohq9X)v" rue՘0DBS';WKzJ* ӖUQ%uޙtΌBߠic`G%@@/- +U{lZkg%AB ^?`6/0mLBe{ҋiq ׭"䒥nEzſ*Y+G8VׯA޵$x(&ǐ/wjQőNiwR"w'6 ÓU㹱nO>X^k!Α({>T_YÀ#Y=5?W ckBi&F;ȆUY']3Oo5S,K,I(IZ,pT~*q 0M#*[ 1f ӣ,bY@`6Χ5+XA\K~ƈaIj-F'\'HROd@8Ya!V2fHL6л7xmK/&֚WA=Ӫ6]D!x-@o-,%}u$W7L8//ȿF۾ gΐk7}S!Iaz$̅-`b\dAo!Њk鷄#DBD3nӻp7{[VsJOͧh-eɦ'A :b!C `럌xh/jzP"/g5ur-8we&^I: ɼ/滴fs.75kW=WUd+q5]RX%H2\[$J,*Fy/p[p,M^4M !Uu@au9m=/ &QY &a,SO//8pJ9Ə__OWŽV"R@eqʠAӝ>M.T]̲PlK##*S;T-Z+֏fK_VJx(djjlD蒱 $9j`ͳW]#SI o=ym6ݽZkLi}!t JF'1} 3>.?+}ѺH|LA01l5sv'ᷫKL;B4tAN]! F:.'Ps%'ll(6J)YR /(_Ckk6t]X4"1*>֌3\vY%{´}yo3SNO3^$߰ #M-/x@/awK x%q} y/E5!#MӖPrK 7te,|B@B>.MGnj#}ڤ2t-eYu ,ч`^.-X8sY-b4 E塇x@^|ٓϹs;7L8?[Ne51tTN'$Z Fb,UrifQG–Cܺc`Rʚ+)dA"q \dk1D .&.b`~ ys :tl$Fэysz@,GGrg?+>,~tx(]^8~i=;Kny婧k]"y 0;i[§H0,<ʖ|id^TRgU1.&&M,"jOڴq d#NcZtMniTE/6Zn>?X{MZ-YD7y꟰Z:@sM_nasQQ9<,?< _DٳZïơS{{ "r-ȋ/(ٳrܙU+l]]ԤA>ê惋Pp >@m-G3 iuFAدBBS gTWUf+Kuv-mT͑|V!+A]_wq tݞT#d~wuD|mkO?)<<[鰿<&4Sv?^w!Hv\rEr㍲ti10qk:m tזfwwM7SCڙƮA,#a:ja ]\ߓ L*}[WiPD<,}B߻6$f~]矓~Cypu̙zM1!yŋ|%˃>(ʕ+ycLhxl8w|Krpp 7xS/ۊ,%Q(iXH;݅\ǒ Vtm.lB,}{/:ێnt &5Kn`ڥ waQu&X»s6%җվ~]?eU DŽqmwu<ܳMo&%ղ>\M:Iz.!Jw(H'1g2:ӈl}ۍV47hƧL{5 )䶌Bn:,&B kLS] n_}DgF0r&5t&y\w~wyCyo}9s8Sd@۷d ɽ &ܬkp%6i*dMnwn!y;ru3 Ѻ~wO@XdY-4P뗄!6Gs!yg}NoX왳sp98E?o9Ξ=+o{P^|ErHI4 cwnHhaOiXbf#Z_ό'/{ tl-ɛؘVm,6w0me2Ca]]ԝv]etepJ[YTR/#<"яʧo "A;::St)9OD٠ʕ+"DŽq .\z]Ǖ+WDUew/_oYYz&C0)ѮHʺ k߂mB,b̝F7LXNW| %.@=/n6ߚuv_HX5r{^^|ٱ5M ;<`&yios߰.IIҧ~zƍ.ŰGfbDfUbM"6I}sQusNJ%4˜'Ĕ~n;yGK_v-A<)vI h59{s¼&4z|_|* U988ED'UYܨev [Lk<-nűPlJ }K*<7.a},ٯSt lmRI[D^x(O?3Y~GV}c $'5tv8w!z+sz'nA @ =eUL|sr 7y14(ڤҥMTW:Y@D 7ܠwqǼfI9~WU~''|_xQU9w\/.;{VΜ9OlM fծAbe'BaJ+j^DE$1̅v$W._{^^x%Ak/_F IDATɥg.K/,gΞ&NEbO}+wJ,eы?; ϓ~vT՗vG;W]Y%.f))w59:ereyer\|Y;ɞC *xXf-@ mo}~C7L_P\"dwt$NDn׍.7n')5O Wߞ˒Ts"߽@ZE N( l%MTt+K/$w>o j;򕯼ϫUJaY^vɕ+Wh'@vJ[]ր tꬠ5Y"YqY@Z4VhK\<*H TĉFy%UAޠ$L3&?yq~=$^]wZvrt9Nvb@!: w%874>w nߔ "Eo[ex߭;/1<v;vMN\ã5cc[a5vrۉ q0Pܲ\р+fDdග{aX8jp__Ԅf3=PWЕvpp gpF4HڮtК1Ļu= m`,06qF̫S_[v6t'>y1`o~PtPUJЃwU:m+vkHWmgU_ʾ;m°F Pd" NiN`JӐpB_7*i]8Sc4S݂ZgX0SY/r뭷͋.\5 ZY:NȢ<aWjڽH]S~R|WQCUVczlyLx/֎^ᔖIi?*e=ЫJ%E4% {̶;ʖ,EH5=R[!&?歟'y?l} /^Lx={l~S"XDz0J[+mpa[7a X&)`6t3(9oceLx=;S~xVS nZ ]y:Jݰ^#Y Uc5%#wtρWƺT'b0_ MohۉcDF@<*{W?3ܘ[ i|_Ot>>ON(h&yV>!9@t+`Xxzl\ւEYI9s7#Ke3GM*tB in-{x5;<^nxT;*:zmgٌj e I w:BmO)IIv+tYvm `… w=hhǁ1w"Z〵q20_k"0 몱 K2@HQЬX^E\:<9Ǥ|&^ӽ\s = K%$ft U\g簲k[Fh(J[}AD<`&y|?mnAexMM52J~})l[w,v ܎xlly98L~f5؎ڵSCς[IG(O.aaʪ@`CN7?(VM (.@*">nyp=3_흀g^ݢ.mT:~KOoT"nxk(Kg|Z -Ȗ h>$9z@ATW G'4 { \!,=e ?]jʰx 'L}{ W遍4S "h161Z$ud;2^lE{ {vw=/Ns[o*ƀjNhɼqMK]+_i7EKCQѨ=2;:}U)SoA+L;}df/| oy {骘(`XU-:U1zU A֖-e0Zχghpr#f/Sy1C/{5=< ݮ2Wel,菁t!?aI˜ԕ%,oyEv4kf Q~p:rES#<}CB ;.\ ;[TѲЛr4҄ ;pm& Uz3`6H*T)3ɐ XA|%tn_]s0u} ;]f/G?AX${Zо-2Wu72HՓ+~+(ȋf?k)1ƶFԓ4D3\Cǣ>*??=8sMPF~oӂd; "kLre&o& `3Ϙ6n6 n=7&cޭ\|E}y!pK~G~dt( 2Cp׍:0^)Z6=1 wΝUbqR Q|KT>=Dh̲1?p]w͋q& $UY(l?J%G|dCȳz"kK`о.@-=1S0[KR8U ZkDϏ`f4 dU!*̈́p Au#ؗ4Zz45G.Q@__)g 6"8J]zZų|97o8-uBAUE&Hyqpnm~'0˒b%ݨ9.u77S%j2%" >HaYKL u;+''<6}kL'{}OT@BGZ=S% w/޻-ITY[Ⱥ oxLm@ۼK΀j?8t+R^7Uyp/^|#8PWXeKB6Q; 6B3Qb:A3Eu)1 8~aYDhc Հv@:Nd3-S1Il rW 0PA { A?$E*j<LWqwȏ"F0T߫@k?uH YcDZ6;{]{y8-I@ɲ iAIr6;֮^jleҗw1יN[o$?6LmWq A:7}FKv6(6HZwoi 9D ӫE]`, pybz=ނbX *VY4hbEp-AТ4ASEb. _؋v9VP{\b6`yUIԧE;szw6ˆM:_v.kAҶpA3_ jT;cUsΈ2 R뱭֕= 4LP3LWqY؟Xv0yF[ D8HWl}CjU~i뷎7qvepR]lЫSR>8gxcwR0`6',[o)#00e]%!"RCd[mx c $ܾ^Ux!5ER:Hdc/Ѱ!Ag1dNF:vvpZ+P>yv\|*ǰ+}-1=p }.iP\ON`.sICBo!@ުA#U P5P'dKrLqwʏȿn!jCi%ym(wzg<2Tl_H0VxȐZj׀f䳆X5Yn/ %6uLTƝw9/^[[-Ve*y\`kvAQ鋖59ͻ+CQ9׏,]8mPH1b<ӓaնR'2ulN7L<wƐBbfx펧zJΜ=QOX` “gpu~Ԫ{.b1ĺqoMK٤g02.d'ΡRˍ CQY^$G$ БϢW|: 2yꩧ?kS]Bn3\Қj*sd!E#`+Fȓ:BdyZ@׾I>5$ Nz"`;c8kQ'ݷL&%O] &q@HksfƏ~TI|)17 av,sq h+YDf"@}}YԙdAFqKeZ n:"(+mHa!0~X~Mw1?`-] pA/*77 m[+RD9V: |l$?`L>;a1!hlp ͼRngtĦ9FzF< @PcuDO O>Ĵ ={9uo&4]fpB*ՓY;c|z"H57@1q^Vd+(=ZqP]Md"j!&vo ?{1yV-n[ٕa.I?C4TCA|(sn00C?k %9Wm)qFض桷ADcXDin%d MbaIAJxy:뮗{l3{w]IÀ 5*C61sxvDGp&C࠽雮Jw F(53$}LЕT17l (C3EL;|}ؚ5":$EyZtWM #]$>q=b&WwtM$RE$X+7Qyaɸ[?ohGvpك9:Ubs0;cXLq.継p$ 4;M%*&< O2ǚ}RpG!?'?9o^?.~6 [Fo:ި{Ӣ8Ówh.,@mZ5@@!3Qyc~+Lz\;Yh0O3tXYϤt7G j JWS1ŋb+f%vP1eRI݉+{+xnkFw9D9nXЫlk$a f+!!"PSv-N -iY!0lF5d&&\1;hU"L?z!WH2+xgꑕ!=@<^ʿ+0$./{%|قW IDAT5n^LϤmpַ!&bH-E %nXc`&23F>sLa[}@f*2u=IIVD%9;(+&*1TP.]4o#MA7#۠C=nVgVBCqjIب uccH`U T)WDuݢ4PV^hl:Vo2jI}Q"Y6']}]$*XM > /|}Quzs .L@fث Ũ}h)U"l@p]b_GRaq8wi=,Q[@! ]B9Ϻ{p ?-G7E2Zc|LC1ZJ&shf|L;VT D.)=&sZ'9 g8eLx|F34Z 0s&SN'̈́לʦM-uPZ+I>9N+NTpʐͷ `O%\:j6%{W$Y=ȶ׼ly%34t:,f%g#u}!Oq]sI'D= zpjK|.Vnļ( q+%uTRٶ_dd ,?@vϿ\U[cS QZ,#lE=qN4Fyмe]E]92!+}uj;B2њC)oP@A9Z %%8sZM7+$_4Rv_`IE!)$NYoP4N_m-72< -RܾRԫa۞U~d*%Sui՟Sib>uѽ&߻hvq(㳄R0$햍 е yI, )?H4Tu&ֽ5 z#Cxb%)l.X4-&L7|3H [=TJ0 Wx5^E6 (w*DQ P;0̐EDHwذ\1#%q-P H5g1)r-BV/n\2&(jΣDIYg,uab\iȳV>Oʨj 3cr9ؽ $ǚ(2Aw8o [Rg>s*aS\pa9he&B[#ۤd"\-ӏv;f`(|(I,XiCoɀǡ'^G+ф_[pDX{?iZ"޳" 5Fp`4G~0O>* {fJC,nbC=ETJJXi?0Щy'X5w*I7݇Ha Q iJC)b/iXI,WD,vݺn5 \$Ĺ'ҵA20dg 2#P[< ЫtsnH6;|x?>R XdܻH Ėɰ^C.N2>2^eC]dDH'KQb3<3iZH@&&Lt9FjY5W: qqzQnʻa=qYY~'3h{L7)"b- <#!(>[ -+8Fl;_jC0QR_IJbT@VUd6h1SM8JY?Z*(OZ/@ϪeBgO@@w}={.52Vlrh[tW|}Q255 jj6f;Dv5c| QnPL2@=^ƶkMֽdLa&\->6Ue Ec"gGl6aE )yNإ g]=*Sj-]}9w=2@\^ ݂s43I˜3)Q.U9X9Mx'oNS%@ 욵~6d ID 5jQ@3{4:`UP bFj WXYۂb(K?#AU!ݨL8 bB7ds(;[AxהG0:HnCd  l4 `!KWIfvU-各芚l+ #4 UGܪ9ɛVQ!T>KZ#v:aXaFM/A{;JŗDcpғO>9vص2p tj"q $I=\l;Mpw\Ϡ}MA/#( hdYDZ[|,G`R»ݫKnlKA5ifd,j*bI]#r)X֕qxIP6%ƷDV$1JNu&R"̓ϻ%'еoMJ[ fuxFT._i35?`Y]@?~O t* W?v 9V^`z=([n,vկRBbp=eeZUJİ3gZn!&YԒ$C2 [ŻQ [,mO^cuPm2 6!*K775#X>iHA)6|fK'IzNPb~&+l@Yܘ*J'Tvo>A9#讻r<rM7B}RuAEC)>4^ۋ j. 6UߖX ]슌4tG!4~5QJӠ%8WrZE_6}3C%9 R6bj\ʀK޶>&9 jP7rY!,8Sl+_>o a =xY!M$p C%50R눐%6 ilJޭ1>j|' n@`*kbry&o{Sm7rc (XdQH z X0%ڪ!ădFK2: -H!xWTm^GY~6ZziEFϘ>~E {q~JRmXxJBTZەYm$HZY„*kbttA Ujrօ3嚱-2߃x҃{Ew ,1p<OE!hQ^4ZWH"le[C6[f}$y]ZxB2,&e8k#$( +GR@UȏI. ֚-TZY9=gz+O?R[r9 %h%SzlPkziźl; ^y?(ZU=3ivc0W9P;y(_kĩ}UZK0[n2!9R!^i`C`4@|㏯U!ð 4eGbhe[Ui Q]lĺҲ ]ME= і5 켪7Wt$-3a !&v*Z(uZ;VuΡ0IIZ~AxЏlaLp˶=ԭmQ$7JvBX6Q ?fHќH)%+O}͒p/ ?3gn)8 K4G'ձ6y MlʩZIB[뭳_,I4 :Z%w!ШBR wN2,WyM-GÜn%fHPSTi{qn`afU{qO("ɴɦHzWUBE$=AE4N<&k !-i[eH {#SjoD{uXɋ7]v^t>Y$]!=3AYK>W:DM^vNF? ;ab(! zo\T^iC;ΥmB|L%:+t*$;9Me䩝hA56upyeQqh:?l6RjAKv1,rMbn~2rcP"m=֖`0#`&9M=sAUb)Y-amW , q-'xdߜGR @9F/)bkڏ [8GcBu%1Yw`d(UOS0.AڮGRK^* R?vfyZ ӹT[7箒$U:r)YUƒr@SX`I[Y2DTۀ3򭪵*Jcެԑ~mfm 'v6 5n 'y; JԤ69lTe$9PrАܷZ7HeS("YJF%ܒgtv(\V|*caD͆KX!A$͛1l.`H-Sz_zRX/B:Pg HRLV2 9ߪ&lA Bd,iA *C+SvmHinUuCDX=Ht|n*eۉEV:M!襒+]l[$n䖁4/r(/7'nHU~pʼL,Y0d$zBY! dCꛓ<5a5vA[֑];SF-xѝ'D6ى[=L'Nw"'hl6@#(]ZXĢkI@ec = ?,JdIP}<-M>ݸ{ІVj ` \]E [jD `Dhϯ IDATc{O!U0D2 yvPL8X7`.FTn"|J/XO0٘qkm"cY"R |Mm82< c\kVc$RJ3+/>~ܘ4kZcQH',- S`ϽW2C޺"+W`eCه2@$\%uXcv+݀lDJ:X%A@ uajBgv ( -1-YdlF/W-a8[pvI((ʈ#1ט}(UIËɔcciZ׳/rQXS/i0p)+@ 7bmwzG<Zej>mSL OH Gթнr"'Nu~'}K+"h,Aq%Pjj xd/'QKY[1t-6. H}''6Fsy$#A1tK:`yy۞W&J3e)44l4Qw_&6`p)Q΄P6-[B8ZuEA*++"I9KAOe'Wv;lf8oaO3< YjRf桮0VP,MSm80z&' iUCfl`(6*d-i/ܽhǀ?Ef~"ʦ9e*q Rzmi|<>J 8 Z.;.䶮6!kr `ҟ륹 Md9fEY&JO½~mȫ,c e+m( @y#8,䁦B=esyč< LZ@E.L1WO57qyjP@74zrpd9Lrr ed+f;ƒ+7oT|\!%@>$yML9  f83"ڲ,:hB|1V+_%v8Vy=Wҗ$Hr#ʁ` 4| -b!CʂBނ`e&;+5!"cQQ fq,D 3sB{O)!i< c.]I@O;]&hE*yPU4SUmhtDTɠ5oIi( {3kR4/ t`mv͟>^!GaV dT-P̠U1'.>dP̂mA=9c:Mj[W ). w!AHY#s:!"7p%u_p -@uYRF2){]f_zβI<?Zrte?Y8`KǽXFChM$%SI[,1[ΦFN0WCoP}bͳCi(2ݔUrPdhsZ;H6S hh j>[K_=R 4U8\rP(\3,q;'`6U":*K\6%iy#`В=S6!kjY>n_$EYM'ZD+kc𙃯Ab57B)4RѤA DP*6Ƀ:l-XYL_Ȋy75HJqK!+k by_Hs㽔t^Af|yL\b۠_j&ZJӌf&U šBմ}xP2p‚m+I?k6g8p62^Vdc͖a.pWܽdm7 nޒkrЅZXiԌ"׬y+:.lA@id[ /L$7a]2Z"NxEY{#I6es7gNPIlKnyYyQ%bnڃ17$Ѡy"S0bxLo͢WIZWUz!0smK3ҝӥcV]li1Ѭے[FCHRV-3hZa(VO/-v+-tڔl.M* ]}A0{ET[l 0 LWsՙ+\ECc]>Kl͠d*$+MKe5w _|=:gTyegm~^w׬),sKT5(aPU1r[v3fm-NC3έlGW9R Y#? 5SnRQѣaU56ɪW]"6d4 i=@uGfS]lT5 _uIF$PݨnxqʔtV@ë0~dv $љ&CZrLNiA0c[r-dD6tePwDIi w_jI[j0N'' * 4Vny^P05MM' P0a360(K, YR2q/aƖv:vv-QJG I.鱬 I+Gne&?av0 E+Ђ݀I,?Yj[iDg )&!wKŗȈ{UH9[zK7~рV1t4Ned  [g ]_ jrBAG A(%&gSmLC' kP);}uE?Äɨ4Xy=50X=M~:pm$!;KgV \ T2 )uցjbԎo26e:A;[x҉3t6AW4 R@l<gZAZҴYgSFJ; 2l lsEF/W|~*ydiB l8(2꒙2r{4+IJyU0GbILZ&)]WBV#{zN @x۴̲HX/򪻐?M"2]d`BkŨWϹ~T=0tYZˆp%+ 뷷GkU{$Y\J`XR xj;b [aFo Z-klE6 A+ /CFUY޺Ʀ1_@VlwYJ @UAA,`.>rwͺF*p.Dp'-ũ ]eY|JrfA7L E}LM_HҬu-o%;̡ Eky_j^|[ƭnX 4][˦WzԤM39t!il/o QAQ0"D'^#bk`AH_Amk.gZ~O1ZtCUUk99l4n8X_F :h0HtuO?H崶{mkVh(:xljccRvxܘ”I3W+hi%h ,7Z1Vgdi ;NJc~gQO(NG|\0oCfY9*ZKXy|@-x`)o%Q <мX4D0kr d"y}j mæksXebaRcu$W&Ww 6ms_+yp\咇BW0s"O#=ѴykHH dbkDY*CƦsIݱ۷N8K]O$OղBjo)@+彵BM,m5uh֎y&kGV" C}QlI!IH`/q{}+s)0Aԋkki!!PQ<QO?~ٖL[rӴ~> u=MT@eNY!XABp2ȅ0\q 62=&<,zzkG9հX4œFV#Amfۮ1g6:γ"=>S5F{)p<=0 @Dž۠f)^t`y` (\[kKndk'ӕ{ܦ\LI"({<,~6?FRZy^g^Xbّ"9@Iwnc۩ _\3Sz{kQ@>166AU~Ojp VFl+!^5N #DÐv@ׄΑ.uz>|ɺz1 Z0*nV#B m VPUVbEebQN/E2_r3OͲF>=ِ(o!w"S جǢg 4Y`"K]E㟉鰣'/_~nݺ޾9Uj\99@oLܩ n9Zqk+ׇl 1X2w[ANhDAA"/tK4^EPMf@f%C7T2{Pq>S xK[%0&j/iXL&'E]Ds5@%3ZJ:;A_g?qfOvi$8ZU`zxᇕq%{׻_SBng UߪIÿm? EbelC@kx2`r|>6te}>%3'o}}?˲'M~VYC^.sK#6geԭ c6@ ~un#)wɸ9-eOvV߸'I77ٟk[G,j5E,J晽V' ǂ1c>.]z'us_}|ALfـeDÔe|H98{s >/Lˏj,%ySQ >zʀ:O@y&ՉH4P:2Uv.\},i^¸U`),XqVZ](P 81U::{S%Gd) YGep ¨9[뗹z{ ~_V^im,} "EzBpʙ^2(W1Jg4,PЄ/g[IRҫAQUAΘefUϰS*V4{PڛS6z#e4c̒P]#Z*oV"[L U|tܡ4G2_^E94{sI]",˟;J\LZRn?Y Dg#NsNQ~׊kSޗ64c j}cJ/nkFL+)~`&wy+XD-sy*dY=҇⵷s 7'*a=(Nisl,t2 Rz9MrIe| qZ mHHJ;SQ~,pRޱ/|q;pu҂ĦhZC-PuJI[bGҾmVAk|hmchDO\f?rm7\/chD xَ9]֘I;]Qo"JJva{yl}[AڛK }۾ WZڐ,(Aռ<-w[eAЪڷ$(adSǖ.)f X t-:/Xq.ql6|-l5O\!c;rNҽs0l p1usc9VH6Ҁ4 +;p #š.Bqh^|pcvx(꣓@Xkb 3ȲmՇ=|bE/E9[Q XRۀTtc+BEF+9w~eT aJb@AE(hx71v(a! \p6/C^w__|Kh;hJ[h@=3 s[; z#_rwXG usg ^e;O%mSϘ:% %`Yr O~D-ir,@sfA 6oZޜdsR\QHc/m+:g@@?V'X6fҏ|#lbY$ ='GCو\l񒖗ŰB s{ Fmك=vr& ,1m,5b:'AlU[8 QBZ;smpw4܌VIr1m98gaݮ^znNffΝ;1Oٶ+pxV_$_nLD5ļXfv8wZz$ɭ2ѽF:rm%j,QS Ԭ͊/dj6Vd}2G1/3jE>=}c%q8UU*G;t[F*PGAxJ3z&ι`R\FC?8XsLO>~^]Gp &/ @f[Ά0>נ$-Wqhf)xFa IDATq5}x:Ǣnɹ sL˼e[ k4 X==ľsN.FhV}(EoqL]wSEUe [q ?5`_zDI]9ο+X L0YkדO>yПmՍ=O.PXAh>bDO!EF([`pftaqOLA48ۍQmG 䫶̠VO?G~[/M2,6jRdUu bʂ3b:,hOC Ep_!zew2hO4*܎gͥ>1W`}я~A9Vu \OpȀ`kJiomͶ4[2 ^u֌dțMZ$,gaki8^6۶׫TТ_gLY)ؼU_VU߅/@4*.Sы#$w4j9O9wC~}S~ rJw ܸq?tϢM_DH5܆' ުlUL^ÍMB 48Vs塯wzaUCt:M f-]Y`S4{&MDG+`æDS2z@^i={!V|Ҡtv<ը١>K"zGzJ-%o+&\t2&2EfL{uuOCa ϠG0N)>|ofSK*/{h 名NK6P`JLr=&8`ۧJEV0>g8&: ԋF8!1a9 }|aL܌|yhVVk'y?}k_S0S^A 1TCu@-e-,Dol'yDoffS-t2aݤ B߽օTL)6~ϧn"VbU񃘙kOK@ ;r;`Z]}i84_ }~kTK0{DWS[B?ΝP;:3P|êu'5iV`Sw2ytbH7-Uw'ubI+vaQNHPˠJ5ϷaE)_U,ՐE"wsd͝DZo=($;-3ɂ[[Lk >!˗/G?Q|IOu-O /~S9Nө!`?KkJd2bX,WtCSZR\ty0п΂nGJ+u4.eˠIbq0 Fae/"[~K5kxTpTKѼ8f{zCC!$}?o8d^vEv ȇ?# J|ߵN;|X6|8-Qn}|[ϘQ/:^:ԫA!&Ҙ6[nzʌ"{>՟m}0j9®#o <6}>!Ucܜ%fZB/R6nJO"dK=p+wn?_񧁟')LT#09c{5.U/92md:0K WT ~PK~l61å@ VTgf+)a.2bbʒO~zYCIk7krI _2ÄZ/sq6wy{(1zEc6}]De.NYC6R$t˼f?eIekzD=tp$I9O_^昱K2\_۷o۵k[[/k+o\#+>FUTN >q:kP fl=zڷ34pxPCI7(f6 PXT&/K%$25)x#vI#h"?lWJ<}س>^zG{WJn ! ydZ֑czC]{0϶2WӀ֎_m2Re* Zra@E9U#պL\Xܺ 5{HMrt[*b2H[UW+W`W ܹc7o޴7nĥw۲ʒN;Bl,չER _AB44Q]ݽM8+!=D:u-lj(b|/ӽ>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////00001111 22223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<< ;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,---- ....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::99998888 77776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((( ))))****++++,,,,----....////0000111122223333 444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@ ????>>>>====<<<<;;;;::::9999888877776666555544443333 222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----.... ////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>==== <<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((( ))))****++++,,,,----....////0000111122223333444455556666 777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDD CCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666 555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""#### $$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@ AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKK JJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000//// ....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999:::: ;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHH GGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!"""" ####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000//// ....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>> ????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLL KKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!! """"####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////.... ----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAA BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPP OOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++ ,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMM LLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++ ****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####!$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFF GGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRR QQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFF!EEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''((((&))))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPP&OOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    (!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJ KKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUU TTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJ(IIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$,%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRR,QQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!     !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMM NNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXX WWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++ ****))))((((''''&&&&%%%%$$$$####""""!!!!    3!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUU3TTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>@@@@ BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOO PPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZ YYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOO NNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000#22223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVV#UUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::999988887777666655554444333322220000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    -!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPP QQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPP-OOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####2$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXX2WWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   = !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\=[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   6 !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXX6WWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!9""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]9\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$0%%%%&&&&''''(((())))****++++,,,,----....////000011112222444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXX0WWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::999988887777666655554444222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   > !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^>]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   3 !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUU VVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa ````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUU3TTTTSSSSRRRRQQQQPPPPOOOONNNNLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    9!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]9\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::999988887777555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####9$$$$%%%%&&&&''''(((())))****++++,,,,----....////000022223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````9____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@????>>>>====<<<<;;;;::::999988887777666655554444333322220000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   ; !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[;ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   ? !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````?____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   ? !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbb?aaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEECCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::999988887777555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    8!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222444455556666777788889999::::;;;;<<<<====>>>>????@@@@BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]8\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPNNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@????>>>>====<<<<;;;;::::999988887777666655554444222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""9####$$$$%%%%&&&&''''(((())))****++++,,,,----////0000111122223333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````9____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::9999888877776666555544443333222211110000////----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   D !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccDbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   : !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUWWWWXXXXYYYYZZZZ[[[[ \\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffff eeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[:ZZZZYYYYXXXXWWWWUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   > !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555777788889999::::;;;;<<<<====>>>>????@@@@AAAACCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````>____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPNNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCAAAA@@@@????>>>>====<<<<;;;;::::999988887777555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   @ !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333355556666777788889999::::;;;;<<<<====>>>>????AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddcccc@bbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA????>>>>====<<<<;;;;::::999988887777666655553333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   A !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;<<<<====????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeAddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????====<<<<;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    B!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....0000111122223333444455556666777788889999::::;;;;====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggBffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====;;;;::::9999888877776666555544443333222211110000....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!9""""####$$$$%%%%&&&&''''(((())))****++++----....////0000111122223333444455556666777788889999::::<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````9____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<::::9999888877776666555544443333222211110000////....----++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$9%%%%&&&&''''((((****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddcccc9bbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEECCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++****((((''''&&&&%%%%$$$$####""""!!!!   F !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677779999::::;;;;<<<<====>>>>????@@@@AAAABBBBDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeFddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOOMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDBBBBAAAA@@@@????>>>>====<<<<;;;;::::999977776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   F !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666688889999::::;;;;<<<<====>>>>????@@@@AAAACCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffFeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCAAAA@@@@????>>>>====<<<<;;;;::::999988886666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   H !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555777788889999::::;;;;<<<<====>>>>????@@@@BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhHggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@????>>>>====<<<<;;;;::::999988887777555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   H !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344446666777788889999::::;;;;<<<<====>>>>@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiiHhhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@>>>>====<<<<;;;;::::999988887777666644443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   > !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333355556666777788889999::::;;;;<<<<====>>>>@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````>____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@>>>>====<<<<;;;;::::999988887777666655553333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   ? !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222444455556666777788889999::::;;;;<<<<====????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbb?aaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????====<<<<;;;;::::999988887777666655554444222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   @ !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddcccc@bbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::999988887777666655554444222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   A !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddAccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   B !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeBddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   A !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeAddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   A !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeAddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   A !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeAddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   A !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeAddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   B !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeBddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   A !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddAccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   @ !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddcccc@bbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::999988887777666655554444222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   ? !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222444455556666777788889999::::;;;;<<<<====????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbb?aaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????====<<<<;;;;::::999988887777666655554444222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   > !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333355556666777788889999::::;;;;<<<<====>>>>@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````>____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@>>>>====<<<<;;;;::::999988887777666655553333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   H !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344446666777788889999::::;;;;<<<<====>>>>@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiiHhhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@>>>>====<<<<;;;;::::999988887777666644443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   H !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555777788889999::::;;;;<<<<====>>>>????@@@@BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhHggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@????>>>>====<<<<;;;;::::999988887777555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   F !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666688889999::::;;;;<<<<====>>>>????@@@@AAAACCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffFeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCAAAA@@@@????>>>>====<<<<;;;;::::999988886666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   F !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677779999::::;;;;<<<<====>>>>????@@@@AAAABBBBDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeFddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOOMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDBBBBAAAA@@@@????>>>>====<<<<;;;;::::999977776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$9%%%%&&&&''''((((****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddcccc9bbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEECCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++****((((''''&&&&%%%%$$$$####""""!!!!    !!!!9""""####$$$$%%%%&&&&''''(((())))****++++----....////0000111122223333444455556666777788889999::::<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````9____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<::::9999888877776666555544443333222211110000////....----++++****))))((((''''&&&&%%%%$$$$####""""!!!!    B!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....0000111122223333444455556666777788889999::::;;;;====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}~~~~}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggBffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====;;;;::::9999888877776666555544443333222211110000....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   A !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011113333444455556666777788889999::::;;;;<<<<====????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeAddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????====<<<<;;;;::::999988887777666655554444333311110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   @ !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333355556666777788889999::::;;;;<<<<====>>>>????AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddcccc@bbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA????>>>>====<<<<;;;;::::999988887777666655553333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   > !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555777788889999::::;;;;<<<<====>>>>????@@@@AAAACCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````>____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPNNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCAAAA@@@@????>>>>====<<<<;;;;::::999988887777555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   : !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUWWWWXXXXYYYYZZZZ[[[[ \\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||}}}}||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffff eeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[:ZZZZYYYYXXXXWWWWUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   D !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccDbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""9####$$$$%%%%&&&&''''(((())))****++++,,,,----////0000111122223333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{||||{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````9____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::9999888877776666555544443333222211110000////----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    8!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222444455556666777788889999::::;;;;<<<<====>>>>????@@@@BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]8\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPNNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@????>>>>====<<<<;;;;::::999988887777666655554444222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   ? !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbb?aaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEECCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::999988887777555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   ? !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzz{{{{zzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````?____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   ; !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[;ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>><<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####9$$$$%%%%&&&&''''(((())))****++++,,,,----....////000022223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyzzzzyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````9____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@????>>>>====<<<<;;;;::::999988887777666655554444333322220000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    9!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]9\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::999988887777555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   3 !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUU VVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxyyyyxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa ````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUU3TTTTSSSSRRRRQQQQPPPPOOOONNNNLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   > !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^>]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$0%%%%&&&&''''(((())))****++++,,,,----....////000011112222444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwxxxxwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXX0WWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::999988887777666655554444222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!9""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]9\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   6 !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvwwwwvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXX6WWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!   = !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuvvvvuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\=[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####2$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXX2WWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    -!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPP QQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttuuuuttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPP-OOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000#22223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVV#UUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::999988887777666655554444333322220000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>@@@@ BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOO PPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssttttssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZ YYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOO NNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBB@@@@>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    3!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrssssrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUU3TTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!     !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677778888::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMM NNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXX WWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::888877776666555544443333222211110000////....----,,,,++++ ****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$,%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrrrqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRR,QQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    (!!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJ KKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUU TTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJ(IIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''((((&))))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPP&OOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####!$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFF GGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRR QQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFF!EEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++ ,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnoooonnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMM LLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++ ****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAA BBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPP OOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!! """"####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////.... ----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>> ????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLL KKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!"""" ####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000//// ....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999:::: ;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkjjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHH GGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""#### $$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@ AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKK JJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000//// ....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((( ))))****++++,,,,----....////0000111122223333444455556666 777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhiiiihhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDD CCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666 555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----.... ////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffgggghhhhggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>==== <<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((( ))))****++++,,,,----....////0000111122223333 444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffggggffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@ ????>>>>====<<<<;;;;::::9999888877776666555544443333 222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,---- ....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeffffeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::99998888 77776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////00001111 22223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<< ;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddeeeeddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccddddccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbccccbbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaabbbbaaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````aaaa````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____````____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^____^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]^^^^]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\]]]]\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[\\\\[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ[[[[ZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSRRRRQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOONNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEFFFFGGGGFFFFEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDEEEEDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCDDDDCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBCCCCBBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAABBBBAAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@AAAA@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====<<<<;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::9999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////00001111222233334444555566667777888877776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344445555666677776666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////00001111222233334444555544443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011112222333344443333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333222211110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////000011110000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****++++****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))****))))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''(((())))((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''((((''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&''''&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%&&&&%%%%$$$$####""""!!!!    !!!!""""####$$$$%%%%$$$$####""""!!!!    !!!!""""####$$$$####""""!!!!    !!!!""""####""""!!!!    !!!!""""!!!!    !!!!                                                            TRUEVISION-XFILE.gource-0.54/data/bloom.tga0000644002342600234260000051730314362112040015306 0ustar andrewcandrewc                                                             !!!    !!!"""!!!    !!!"""###"""!!!    !!!"""###$$$###"""!!!    !!!"""###$$$%%%$$$###"""!!!    !!!"""###$$$%%%&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111 222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<< ;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,--- ...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888 777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((( )))***+++,,,---...///000111222333 444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@ ???>>>===<<<;;;:::999888777666555444333 222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---... ///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>=== <<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((( )))***+++,,,---...///000111222333444555666 777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDD CCCBBBAAA@@@???>>>===<<<;;;:::999888777666 555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""### $$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@ AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKK JJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000/// ...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999::: ;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHH GGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!""" ###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000/// ...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>> ???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLL KKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!! """###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///... ---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAA BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPP OOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++ ,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMM LLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++ ***)))((('''&&&%%%$$$###"""!!!    !!!"""###!$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFF GGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRR QQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFF!EEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''(((&)))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPP&OOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    (!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJ KKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUU TTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJ(IIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$,%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRR,QQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!     !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMM NNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXX WWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++ ***)))((('''&&&%%%$$$###"""!!!    3!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUU3TTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>@@@ BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOO PPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZ YYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOO NNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000#222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVV#UUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    -!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPP QQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPP-OOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###2$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXX2WWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   = !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\=[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   6 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXX6WWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!9"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]9\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$0%%%&&&'''((()))***+++,,,---...///000111222444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXX0WWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   > !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^>]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   3 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLNNNOOOPPPQQQRRRSSSTTTUUU VVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa ```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUU3TTTSSSRRRQQQPPPOOONNNLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    9!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]9\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###9$$$%%%&&&'''((()))***+++,,,---...///000222333444555666777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```9___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@???>>>===<<<;;;:::999888777666555444333222000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   ; !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[;ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   ? !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```?___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   ? !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555777888999:::;;;<<<===>>>???@@@AAABBBCCCEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbb?aaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEECCCBBBAAA@@@???>>>===<<<;;;:::999888777555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    8!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222444555666777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]8\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPNNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@???>>>===<<<;;;:::999888777666555444222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""9###$$$%%%&&&'''((()))***+++,,,---///000111222333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```9___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333222111000///---,,,+++***)))((('''&&&%%%$$$###"""!!!   D !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::<<<===>>>???@@@AAABBBCCCDDDEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccDbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHFFFEEEDDDCCCBBBAAA@@@???>>>===<<<:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   : !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCDDDFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUWWWXXXYYYZZZ[[[ \\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfff eeedddcccbbbaaa```___^^^]]]\\\[[[:ZZZYYYXXXWWWUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFDDDCCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   > !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555777888999:::;;;<<<===>>>???@@@AAACCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```>___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPNNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCAAA@@@???>>>===<<<;;;:::999888777555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   @ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333555666777888999:::;;;<<<===>>>???AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddccc@bbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA???>>>===<<<;;;:::999888777666555333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   A !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;<<<===???@@@AAABBBCCCDDDEEEFFFGGGHHHJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeAdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJHHHGGGFFFEEEDDDCCCBBBAAA@@@???===<<<;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    B!!!"""###$$$%%%&&&'''((()))***+++,,,---...000111222333444555666777888999:::;;;===>>>???@@@AAABBBCCCDDDEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggBfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHFFFEEEDDDCCCBBBAAA@@@???>>>===;;;:::999888777666555444333222111000...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!9"""###$$$%%%&&&'''((()))***+++---...///000111222333444555666777888999:::<<<===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```9___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===<<<:::999888777666555444333222111000///...---+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$9%%%&&&'''(((***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddccc9bbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEECCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++***((('''&&&%%%$$$###"""!!!   F !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777999:::;;;<<<===>>>???@@@AAABBBDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeFdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOOMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDBBBAAA@@@???>>>===<<<;;;:::999777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   F !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666888999:::;;;<<<===>>>???@@@AAACCCDDDEEEFFFGGGHHHIIIJJJKKKMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffFeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMKKKJJJIIIHHHGGGFFFEEEDDDCCCAAA@@@???>>>===<<<;;;:::999888666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   H !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhHgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@???>>>===<<<;;;:::999888777555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   H !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444666777888999:::;;;<<<===>>>@@@AAABBBCCCDDDEEEFFFGGGHHHIIIKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiiHhhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@>>>===<<<;;;:::999888777666444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   > !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333555666777888999:::;;;<<<===>>>@@@AAABBBCCCDDDEEEFFFGGGHHHJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```>___^^^]]]\\\[[[ZZZYYYXXXVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJHHHGGGFFFEEEDDDCCCBBBAAA@@@>>>===<<<;;;:::999888777666555333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   ? !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222444555666777888999:::;;;<<<===???@@@AAABBBCCCDDDEEEFFFGGGIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbb?aaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIGGGFFFEEEDDDCCCBBBAAA@@@???===<<<;;;:::999888777666555444222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   @ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFGGGIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddccc@bbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIGGGFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   A !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddAcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   B !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeBdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   A !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeAdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   A !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeAdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   A !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeAdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   A !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeAdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   B !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeBdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   A !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddAcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   @ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFGGGIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddccc@bbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIGGGFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   ? !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222444555666777888999:::;;;<<<===???@@@AAABBBCCCDDDEEEFFFGGGIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbb?aaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIGGGFFFEEEDDDCCCBBBAAA@@@???===<<<;;;:::999888777666555444222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   > !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333555666777888999:::;;;<<<===>>>@@@AAABBBCCCDDDEEEFFFGGGHHHJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```>___^^^]]]\\\[[[ZZZYYYXXXVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJHHHGGGFFFEEEDDDCCCBBBAAA@@@>>>===<<<;;;:::999888777666555333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   H !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444666777888999:::;;;<<<===>>>@@@AAABBBCCCDDDEEEFFFGGGHHHIIIKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiiHhhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@>>>===<<<;;;:::999888777666444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   H !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhHgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@???>>>===<<<;;;:::999888777555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   F !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666888999:::;;;<<<===>>>???@@@AAACCCDDDEEEFFFGGGHHHIIIJJJKKKMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffFeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMKKKJJJIIIHHHGGGFFFEEEDDDCCCAAA@@@???>>>===<<<;;;:::999888666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   F !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777999:::;;;<<<===>>>???@@@AAABBBDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeFdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOOMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDBBBAAA@@@???>>>===<<<;;;:::999777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$9%%%&&&'''(((***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddccc9bbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEECCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++***((('''&&&%%%$$$###"""!!!    !!!9"""###$$$%%%&&&'''((()))***+++---...///000111222333444555666777888999:::<<<===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```9___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===<<<:::999888777666555444333222111000///...---+++***)))((('''&&&%%%$$$###"""!!!    B!!!"""###$$$%%%&&&'''((()))***+++,,,---...000111222333444555666777888999:::;;;===>>>???@@@AAABBBCCCDDDEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggBfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHFFFEEEDDDCCCBBBAAA@@@???>>>===;;;:::999888777666555444333222111000...---,,,+++***)))((('''&&&%%%$$$###"""!!!   A !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111333444555666777888999:::;;;<<<===???@@@AAABBBCCCDDDEEEFFFGGGHHHJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeeAdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJHHHGGGFFFEEEDDDCCCBBBAAA@@@???===<<<;;;:::999888777666555444333111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   @ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333555666777888999:::;;;<<<===>>>???AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddccc@bbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA???>>>===<<<;;;:::999888777666555333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   > !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555777888999:::;;;<<<===>>>???@@@AAACCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```>___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPNNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCAAA@@@???>>>===<<<;;;:::999888777555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   : !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCDDDFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUWWWXXXYYYZZZ[[[ \\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfff eeedddcccbbbaaa```___^^^]]]\\\[[[:ZZZYYYXXXWWWUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFDDDCCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   D !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::<<<===>>>???@@@AAABBBCCCDDDEEEFFFHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccDbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHFFFEEEDDDCCCBBBAAA@@@???>>>===<<<:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""9###$$$%%%&&&'''((()))***+++,,,---///000111222333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```9___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333222111000///---,,,+++***)))((('''&&&%%%$$$###"""!!!    8!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222444555666777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]8\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPNNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@???>>>===<<<;;;:::999888777666555444222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   ? !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555777888999:::;;;<<<===>>>???@@@AAABBBCCCEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbb?aaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEECCCBBBAAA@@@???>>>===<<<;;;:::999888777555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   ? !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```?___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   ; !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[;ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>><<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###9$$$%%%&&&'''((()))***+++,,,---...///000222333444555666777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```9___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@???>>>===<<<;;;:::999888777666555444333222000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    9!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]9\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   3 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLNNNOOOPPPQQQRRRSSSTTTUUU VVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa ```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUU3TTTSSSRRRQQQPPPOOONNNLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   > !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^>]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$0%%%&&&'''((()))***+++,,,---...///000111222444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXX0WWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!9"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]9\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   6 !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXX6WWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!   = !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\=[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###2$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXX2WWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    -!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEGGGHHHIIIJJJKKKLLLMMMNNNOOOPPP QQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPP-OOONNNMMMLLLKKKJJJIIIHHHGGGEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000#222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVV#UUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>@@@ BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOO PPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZ YYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOO NNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBB@@@>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    3!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUU3TTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!     !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMM NNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXX WWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::888777666555444333222111000///...---,,,+++ ***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$,%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRR,QQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    (!!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJ KKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUU TTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJ(IIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''(((&)))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPP&OOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###!$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFF GGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRR QQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFF!EEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++ ,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMM LLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++ ***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAA BBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPP OOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!! """###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///... ---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>> ???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLL KKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!""" ###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000/// ...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999::: ;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHH GGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""### $$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@ AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKK JJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000/// ...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((( )))***+++,,,---...///000111222333444555666 777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDD CCCBBBAAA@@@???>>>===<<<;;;:::999888777666 555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---... ///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>=== <<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((( )))***+++,,,---...///000111222333 444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffgggfffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@ ???>>>===<<<;;;:::999888777666555444333 222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,--- ...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888 777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111 222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<< ;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeedddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbaaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaa```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333222111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...///...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---...---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,---,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++,,,+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***+++***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))***)))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((()))((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''((('''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&'''&&&%%%$$$###"""!!!    !!!"""###$$$%%%&&&%%%$$$###"""!!!    !!!"""###$$$%%%$$$###"""!!!    !!!"""###$$$###"""!!!    !!!"""###"""!!!    !!!"""!!!    !!!                                                             4 Paint Shop Pro TRUEVISION-XFILE.gource-0.54/data/file.png0000644002342600234260000012622714362112040015127 0ustar andrewcandrewcPNG  IHDR\rfbKGD pHYs  tIME+ )s IDATx{eWU&>ʣ (A$@_! OsEm -m۫Wnn_\AH<@$@@@HH*Uuc1sS*٫sX{5 `y,3___Y+ٌ"* ȋz6K[OK/]f_]]UI gc a]$(, SxPHdH!Mlmm}r6tuuSU={ןv)}C3ay,=?~o~|ؽ{TcɼPE B D)%Jϲ 42@)1T,O<9P{X]Y9WD%|[Ϟy:/BtIdyǧ?i<ۥ]vbsݻwmm ) yq敭*xH}<`) T_-|,+,aEDk҈b]݆ooySO| y\{8'vUW0lr\͏g6O,DDr&V7lRv!=~.i^RN5;bn@2 %~(H@uv;N*O>kuO^Pp\s mOڳgfNjHYey~}m'r.%릀3z"`Jg/|`k8(T(Tbkk[[[WtIWO]ÿӟ卶 q饗_fY[[[/gl'ewGڂr@?ыyێڻw+g?G><Xވpg<}s`b׳٬b8b{;.[%~ԝy";= .`mHl DKq|\ e zݶ "oniO?8S72q~wW|Ϟ=gZ+Ro=[n7')p3J5o 0:5Y4^Hk` Ae+' (DڂH PR5i 1_nxӟRm݃e8(?GYf =8LSxo ~96YAZ0aF&_:dhI}F< P Jhc آx$.D޺Xr)@pEO=yy.;nן~ bQ/3I9O:餟ȓdSNZpGu#{K>D_<|ܮ/v;VDŽa&ڃ}Y.wJPK p9؀[ -$жE`j8,=&O>?g,g? xq b{n~"' dC {n EvʶlXǷNG?T$!禶c"Ш8RO7TyHsuW7Ȫ@N_x\p`;oy/3q5 sצM] ;WN r7aݲ]SPO\nǶҀۯL~r\&t FE¨GninZue @"G&B"c줵"5(B|CjGʭ$o&կ㨣ysN_~<٧-o{{<K/՝YJ;;6~P|i!eW/XL<>uv`G @i)W Z8R YZ= UiH՘7@BBhc6C!<^lnFꙷ[S8spg.xކ=Aߵs)ѕ|VgO~T0"Er7]ȥ4$GL#~rĶ@hAKڿ> dZF֪5B[Sk=( |VP·9&XX0caT[c! ݻByn_z6/x`mmSCJW34X-"L$ IB) }J2c~/H)!;IRjTkdSr5xIN)w_wKϯو(ueLR5C  C}I|)KZ sXy%ڶRCܵ'ϫvZ`H|U[˥A`Hiuu0\J@1[o}G}fYރrM$ "k"|7e?&m /Sꂀ2cdDJ·XP0G  @(%&z; d{e[T3|W%" պܵ5 ef62?4 g8PG]c ;e?6Yԗ,K9|ͯm@i"k-j (YެŵH\Cuɢ?ݻw3%w`Uw28'eL?z>F"}67B8efqϡ2C:Р ֣ $s^5PLf5v<AU-lmm}d>]g{߈%p(\s5OMqQz#BDWJR3מeeB u;=|_.сH8=6aYw[}9Ӛ5(m!/ JX(LCfB¦Q͓} X:BEҿM7ݸ{~~ip(^饗#1wXzfo^C_D?MN:)IYQX (گ@ 2KJ-_—d>(2c'Bbqɮ]>3<\|z2 ^{%axl6R>ɀud@&t/ՠHԧᱵze .egn!B%ӈ@a974jeٵTd|[[[PSJvϾ;<o:N6NC iJHaҪKZ$,Iuo*^{P9RMVh~#׾v\pc91gxISZvwJ#xIB j li.A xѵmM#|'JEՀTIϡ%ch:ɳ^XJ ud.u׮[׿?? csmm\r&n$2)E>ktPx!F763$8Ai-@`5h Tˍ35Ր~gZϯ!OX]]}|>{l6 1^o-$ZORȽ iΌ@r[ R΅:1QKf`fQIչխ> j(ƤnU͹2e5*I !67ws=ݶ_؏Mx;`O|".䒍?/ɵi\_9޾uiGjI@pATJ| R>EuׯYm* 4 vim)`5+<%6f l|9ox޶/xw,\'p.䒍;v~6`fR ؄ vJ~,- Sggd+$-})zVqCʞ҈IlJFI:gA"@)}#ـ|ahAsYp Kwرu0rx˧v l\.ɺP XR/F{e2T鯖LHJd~^0,[ h;wby4bH0`6RzƝgy&=evK.'>^z;ݷP\_Tc@V0 H%=/gvaSLo7fERi޽(r9;CSra{)a6;mccO3 _=."0 I.K۱|Zl|MayB46ȐK SI,jmvR7TGʱwǎ}mmG<|"N[뿺[^qbz Pum ]21|P._|-,BzZƚk*o$zJ(H(se:&. Mٽ]g~ꥇ.O>[&|?smu7WVV~tL#eϳF}pZ_wbT+s2!n|͔Y2 A v`ZkD۴ԣe#|&0.>&"e6V~`ǣhwǭ|>CuJY2Xp'rE ^u )\7 | \FcעZu_]̶<\i8XzvA Ψ+e6s\=YVag?c6V_PQH+2[MYw26=R,,6f&iVq.Xee`:( G.5XK߹3~ysw̵=V^IސП[qgm06h ˢK۔PDQt'6na`ҟ>gty6"vR7HaMY &9O\%bwݏO? ܭ<󚿾!guzZp1oqٸl ^rVd"8D(wq$c/s1j *~쯏X`yJ(83}imoKwoxd^jL2`f/\YYyQG3]pg>G?1?[[[;}4]?LݭB=hI{hF¯́Ѥ["Sf7c` Er \z#N?ъ:<ll?{Gg;1 &>mv7WthL>E'h}.:UNJ-dB8^ Pʜ 0PMyPoaܕYؽgGn_?o=>r +N"^12n^TxUOqY.ʻ6 p~<2~ADґa6rItc!"X{\b+ʸYڗ2\"L9 UXJ$l6{K𞻁pO])?wizO'a4[0RDbN7UJ IDATZwm> 9{GZ tٍuDq ̌LfkeFS0&GcMgЛ axlu?&>O3Io}^cIrZw8[]օPz/QFҨZp^yK_$Py9Ç:O5 `>Oo:0<Ϲ_pW\Д_󇷖H*R ?%GR5; ,г;ƹJmd[KmفVBpGG^vm"/TF`l8OGscf;gZb@(d$?]O  /pQn6̇axx*\S|nB,g M<o3# %ztb,d)p;?mړԀRԟWoVX&ApA+++OySO_y[߁r|WiQD$)P~nw\~\.[Zzy{Nwt)yh1mBPb,t91g)\@YAH)sꬂP*ِS\Y}o8?3:hUW]w[ou9DʨzgD%B?б1׳~*#mWIH|~ qmmgjr 8*&:ZkB@* 9].X[{.>kS 8?wX""$ Ʈ@&\ȾJI ȭ+|C?\xxk VF_3pץh1Q9< p㿿50)].p@7YAɕ)>s&1̀hu9zp??:KY?ryH Wuޅzks>TXɸK!_經vO-jzFiRN[ks*Ve^ 2b@@ [w=r%a :‚ __Wp@e]t_j@C%'R. 8SN2ssvQ}mAZg݄ؠQōVd6CN[, wl-=b/ /޹7a/@&$!ȔJHgFravzp;*-Q"hiM{@"\{;.2~o+uJ@RԺ[+яHEfcM|7 .7h{@2~獍p_i `!TNdjh[ ~>uآΈ(/ &?zYWQP4 ۼm|=PLL X 9#|-M=v#Q>,Iiΐr챚a؇"Q%I/qh&7.z˳zwHj@f %L:; FbH#P)Y[""[uM7g$GuStCGtlĮggf1/á)p=^a;$h{! hbwY i͈;gٕo(wKEK@H'dGJqQG/UxW֟-p6Ӆ:S^l)|`('X{}0y18,a0])[EbF@Z̸xt("l-PU%s0A(aeue8J+wDr]0SJZlDH 8+-)s Ԍ9 ~vM {XQ;yp6cZnN9OW2wsLG|}ZaRB*r69OP.2eDCz:VZ&(~K?l'fNH],PC.UHۨ h_ 10M2ƺ̆8OI]H&̝a}[zhd]voK0$=R;T P%5o 62 1Xg;!k "/>YqZ[9)bO\-]$T,($$[LA P9@kch).RB*׽/> Y|&+dl -Pُ7V2e 0ٮ\Ñtz6Nqs*>Hfirk9;s_u.^6ӡR*,Rĸȥ\ %Rlev耀W,)֔&Λ ,aD)}4yr;=!_ n\09hץaZ$Br KI!XXpks_Mo-\j̳$Cn^U F({ĉ G-pg @ڏ[n ;@M'qfɢBIU&Buڐl(1fرcǞ|['2t.mX|SC'v?t{C}o%WK"'BerIp Pjcp4sRiSjUs[=^u~gH|"D9٣H)3fPmXVڦwHv%!@2>X5<<8$$8#)u{`HI*_5iO{w 㒌|Zz,GhiQ-xxvsqwnǒ2$eh+gӻP@R- $!ە "RrV0TTWU>رtUQ"5.4%/'7 ?u)I&MrB┉wq*B)Bp|yBmׅCa3 :4e]B5Pq$?㬻 2-FhUlDzT?SLAVk`ΠVN1j 曯[?W#؅_Vv삌N.jqE-a7#B4:i؍˨|;!,yKf ƒ.>s(r LEPΝv;*X__*xmXK#W?F!1`n_ .dݿn*+p\ -Mgv㶸y t΁%}!XP}9d^PJ"n)K&k7"++s`my0 /0-id*RrQXON+0#Ζ qȪIvE}Ʌ((tI$>>Y:V$n:9EK[ѰU҆%ՍT@.!WGv+ &+te7 l:صJwp'b >O5=ZOi00rtMX$J`'pXALl.{#$Z VEnnzs҆1TEzơ^r.Cc. '*|R 63lmF5b~}YOp{AsGԹV*ϘD2͒`s.mZ'-Z> V6EIٗ].M⊌AͫzxZR"а\n 1tyI{`]ݹeP)'j|j] ͢9!i^)a6#TASٰR8IUw uv]W7_q ^y*d"K,AeLt~ED>Dž@/}dqD0l\dЏvNc`B-Aiona/ˊG#,rRR.)gO9A ]lWX0 * + GC ۡcVȀV~>}b5U鍭لdDPߍ3L~oT7V\-\WRD Z69{`^0[l-βl[}q gi^ޡ;TrsI&ر`Y MRiv om}Ư%{ @{T~9kn#+v"A }hCsL\c̜(I*&)XI|r lnm7y<aCD~ܜOpg-Sm;xJ*#xy܅(hT㯸>ћ{Zwe?/ކڳb h-L6"\-35Div!QP? ~fEc0HXúuEWeS!H)F Sl򸋐$(l@v/cU-q9* 97}=s :+7BGq,#F$ƀf-Q g#~$f; [Εb) 3zس6=$2/gX{<ݿ5nc@X_ko|I19oڿ# 3ڡ8L2?ZX2`%Z;eeee倀+++4=l& DgᢨzTA:1lVq|UxeW֘czhk)[/%shto%HRt#f]VË'vXC'btEpW1Fuͭe&9k{^L"BVWVn7 s ,bP&:xbW; + XѸ(|oQJ\]i>ER'e22f~ʐevN;rl*S:PR%lgff&ޓ1bw HEF^ܐ 9/dj3&`$|j~#oԌL#jd =1t;*PLE1֎3֞s jZ2+-e]1`.A .IkG>+)) Z>d ׿~k^ T*ۊ;h3mR8uAvqP'xH vOEn-Ԟ VnKC;''u ȅQ+ ȶȂu6|U'3Q#?*>NЃ]7>iؕ/.)e:0 IDAToyTڡ`Qk'$!"xl6;*ʜj ǁb](Jh$ѱ6B*~Uqz+f9ruҽyW_*R&j(DW\*޾6^vx!;8KU\K9Ӌ&l-P#0fqjyJ?=UadDCxf4m:wI>#? k/b:9%@f/)+FHR*ܮ䧇sOڶh`-uv-rkemVP]{Ni:k`LT٤ɄFQI8"Zݩqbɕ0ߥyAl*6ij=~0 B'먊HԘLFczb s?O-^hC[yGA}vx;Z]'VJ)'D8-u$ f@\ߩƛ/t{/@rSӷ{7PZ\bvk9lG +mAF9+l|Ih"88)6o$ 謐C,d لTK >@4]Y@Oå,Y~חvil >娭5(0;:klSgEh>9v:]9dTMk1t:=dqY}l+$"<5ADrtJRSX.5۟r6EBL7~ m_h0@;x-B0L5{j EM)"ӇdVV+im{q)ȤkvH 08N5ηlg2 f/`*.vtuQU>^.i|ZQ-6>d[L/>`/@ hȥI<kV;O#U4@O-m3O "nR89H@R.q*!tF#bzQž/÷5NF MdĉRyƭsj&8ER_{tKRjb`TB[zK ЅU ŠIk18i4AvwJ&I%Y;"!z.?L:rBv@\ܤ#jez `1JT.rDuӉtđR$1v1x>j~JCM^q#%h*϶N.f`A& U-0uDWQ\, `^jn6Tפ7n "P"r]"Gܢ8I)'E@,K$HRM?$mĵ۹ZgB7NuL5;m<_^Ƙ{_Ksj\27xa#SdKND>D^gލb'ӋyovTy&#/3Tj͵5(WEvל_cλkJQdAb8@[Y9EYxG4~bHszZ5JV3a6y45NZSWTf& o,NW\y .$z5;vwL8 B%0bef -F?Ճ c=,=^4<41D#̺ LI$%rЛ9SήuuTod^, 67kT~RͻBl`K 풪Z[DxebO2w{?ZZmDz/=@Qv7F#KEݤb<ޠM\zV /62fg=eɬeP{^c?6/g{- Nmz+=w4d@a$]5(`'^<Q[_2ɞna _=eu( 9yJ;K~D tss3@RjڈKTR [dQ\>vvcc1ra HMLA L"*\I)U\F}۱ʶ~fai{n*Ez!QZ1;㯥@e%9X޲jZ-ҳtoZ -_e~6L_Z˸ojǛkoC@<2vj ΂]kU;FVdkQ+|sDh_Tajk;ZEY:/Z8trI QɉA$1tS@֟ B|/nPoz59qfqƈ5ԴkIFvvhiuP(11mCM NN]]:ee4{p_ecھ zy1C^Cuc{hh#{3{iJوp%>e5* 8aWՑY<72??tsx1jdV4hj 2yt`EqBt6OQ9FLdkVpU( "&yYTY!]Mdc99ם2Բ:rRƔt,fwQ!ŅC[X}BB,k>{Evc!80W_)>a1dy#*HCtg H^띊|x ^fm/ʻRjz&mm[yGJDLq2mFY$e6Rq۰:R 9L2zo:sc=9Y '{cFv.=qڍ1m?&k{&,` ^sFM;1XނzL : uslm'8Ir`X9& Hb6HOKOJK3M851]`j1V Znב(nm=0nN\0JO 2nSIO+79 ؋a=~Ȇt:: ?FewCo(~J9 lRUu]uEa #LOk;rj(` A_X~:h(.# 3Lg 3IIN`tk {v]s֞+%sP3QPRuSv#א&@DC@%D0k^ HGP] @Xrhep`XxqTV(M2%i݈y0!wu=]/@ͪ'(=mjYhNI%cA7UVװF 葸t"mC UoaF5WRCƼE,NĎ䤽5&ƥ!PV:1T > ekk{NV;w]F>j1!6åjpVˆFhM 6]Fht׎ v6d2I]N/(m~6Fcnv ~2QΡ\MU_T Q'j5i jhzL1ܬ>0xv3 *0R2l:<A>H{vPzrJƞ-JMwpY$K(FGo~X'ĸo Xzй/AS]Fݨ$]_N:_& W!z@ n[$|c9_d6jpScDM~ ?$Aװ4Aﺾd,LM>g]K4܍# {pN}|GsXVUz\g:5CƔ1bIb] _1nS8sx>Ic6<d6x -~,\rsNgOymnΝ;n9Ve~ N5:~r'\1il@l@]O]@.z5`bӋe{DK:rOJN:Q]-^sQe}p]ӑ[5ӓy஝"FYV@?D0FbFO2w)n?d}FvەeL0)pAK&ö1g~T+`g|j/P#6A˿~6nǥB)<"٦FKm48aqGMx)آ~ hO2k1hbUo0&W e$L&Jv +70P|נ5J .CusxoM|IxtPbKq`qk )U~';ج݂ %MTPu zzI!ΨW~hSExAG6:zmϗh[<"Cp@O TrxJHe[6.D˶HcEӻ@{:#644!k*[Hzq^%AL#끋֭$%JvoYHsuf1/J ]֧z! ܮ\A"oˬNf:r)NBrBci!td@ phש24KmT]bQf)4Ng/: 1O,pJSYJڋQ O3t}IsK"cRYJKESc}Jc,)` K~^gnl: D7~@s[֭X]Gե{xN~ Sۺф#H] ΌU]h7^B}uxUlϣ{/1m=+o!.9BQzlR:=?`Rdߍ 5]k7?|)W;y?yVk6Q{ `Un /8EHܳ:68sL /xr.R)@>; q5@cdU+Y*Ne#ɉK}RZ96H7#IT"S6NsF,>wy#~4N?#$!]]7[R Cʞ?6lV !::9sE$epűJ0^o^$kˊ8 U#T۪Xpƙg@R!W M6qWP&ӺjA%UzW\mĂRύGhPRye",\@S'fŵߨkߵyn9P?A-Y-~03UVMN^Z:KLhv Ռϗ(^Ű۴HM3LkU$a oAF.foޱ8#Uf){׹IbriN=晗.XH6]NlGD(=U7nfZ/mlb7+ez ?D㯃 zjq[UI/MN>Vlk3ug$A)u j4|AM ֥ƈSۓU&#\+u@bҳyl] K+ˌHe;Fg2\gUm}e([ɐB%E*}7R(ͩ7׎옊ш@SsO-Q%[ԹRM2MQ3ˈDZnNzOvqBek"\cLku*`HORٙ8]PKņkDk~{5t1B xA:ZU 7 $T|Q(%Qd](F]ĹbB0űMVJ[$ҐTsKHyoAi'ץ} m sȥ y/AJ,Қ2KPe׭[0lϽN!aFrs{M AQLEH( $ zVj֎ z5#_kEoKmhr-muL]TG!=ӏJbⶏ^ hڱ'3ϬCKbd4ze'p IDATy=Pg?)R<ai*嘤s!DR)< xG\TP*f^[Yg#٭[w4ՕR;CZ [oC]wztӞ.XY4ٲ>޻[zVZ\uLbWfʃ1ؓx3cljnhը%HRNLJLa uCRԭml{w==Q(7 S } M` u6?>wre2/[)H:VK,N7#W$b?ַ~ns[ٳ*݌-DBuiLЛX3x1#xNZhyNXc漠(AeFO1;B‚Բnv6Zx:)'R9:u넃h~Q_Y^ "㿟R1$QdAF );hy`Ujq δ eㅇr::ӄs.,{&꧆0.vk:@r]gJը^z1X1)M9q]mPy٥őPUӗP7 "D3qF/xn  1]TG:g1'Sn!'TrweXE_;!I%Q3Gy4:I(-64_EM,"$Y{ċ NX0F&r}z~. cZ3IB-NOi͖i/=Wwmo*ϟ<ǽnӖwa~ާ5=#- Xv"PQT"ek"v__ Zc ;dn:@%?aQDP8tP@1X㟅!ԐB cTq1As:zuؓ8vuB6W =HbxRe(4KN3"Xe@;!H4GUTBWָ;mmnѩ'Ng':*lRnn֑zf/6olv[;"[_g,ũ7E>FQ̫#P+bLDg=CMNJϺ;#E`kŲ7/DFqYps9/O֔^2H N;C* 3YoSí'D`'tL#U%~{*TD|S~[`'8>I;AQp YS޼~vMħ. 8J@ز۬?*;v \Z]INGC|B('C˟J92Jҹ\9t&b2߱zpX. 452ٕ 9 mZǘjR V+F~) -ygN4p^Aޣ ?nSŨz\9,H-1Q ƽdJ1fȩ3n;\yvy}zwAH CZRś^ጒbvWtBţډ{t1_'7T.BK슍wg$HiOصk H1߽ gyW_ Be?Ó9W?zKx2`32׀9GbB ŒvvR$cb1.y,X=Ç1tn/_?/]YYΝ;EU9? F9cJ33Y K.MpK[LMJh8hě{" ).@m2<[싎wy/K|oQ2({%מSi<pFf KxwB曇ysKFrqTjӡ дNbj+jxoR̙RnBףH]`m@g-TC67NKg }'N>[ ;kv"خٚ 0{]^k|b:$apP[d㛸<7Si6ňNi.&.xCG Jq- tqYHDOatT 5^ 9iBdձESxXV2 E٫wh P^WirqhbB?bk7c?i ݖCF O3IsMmLg 'vؔy%Dsemq-k_0>3m)$jdwbʇij44gC ɧKvDa;w)?rגz(w;w%)o2!k*:@ڃ!dt Rm_K eFÐ8C˳hPMuXU7kp`RR%6ǧVvYðM?0A12~iW6-V/(u*YFֈvl?}e8r3ZY=>t\9,C>@j#K~滮w^Gyh7οE|v987W5koW;bCU 9麬 @n=| `׎t#w_>٢H-Au52AԾ_hܤ}"`69n)ɚ`[XL*H;2e̟[No޹oߥO<}8ಽlբ̤ јvKAI^ gpC(|ރUtg!3 *\6`Aa:(W t3'F3zN/[Xo9+eCTL702jjC`g& ' ۞#)*8R?Pz .')ɘ4IQ7ی>`椉T ˬ`qDLa;gd|beuuZ"j߭~A1,NZ%C=ERwzRQ%v - uzz%yy*_fj\:OR踻'ؕWӓ+MZ=3Sc`U(Wu:O;9v{[H*.OQCCݴrhXeDnOn@ZI1δ4E [$0@{Zo [[Slnn{wgйLxa(~:3ܒQ=)3$ GB-vrHQrՓ; :lѬ;ā܍Ir4@1^R svBXo|L8N9%mNytE"G[y8dEkUq4jۈљ4(rRAD{q{p Ŧ] 6pWDjA&0Aeh;bMdvnRyB&qpuYF  ]gw\|-]ZZd2!ֈ_ZΜS* |f3FUH+eJ" 4!s @lmn@wr(n;iAsL6yK1R^Ύ0ZV>tC ) jEz_4)mpR,EPJ0JA(4a0(qc0?;(Ԡ35 |oAS@0!81k$^LȞH\\Mk DB 2;!LtQbẵJ)?*jQ@%Wqo|q)8TTBa:v޽޳9*'@U#տ0`6K.™8( A-MΪ:`䭻I4/.KcBmwgtY}OU $~XQ뾓v11F\!EgUb`wq-[=h)~1UCһuD횏#n}LgJZa,VyGQPx"<Čs42Wy:z7 aħr2sz\I?ࢋvC* 4@G0'TbSD'̵sȆPzϟK񦝧4πACI ]bSϗyu "5hPYХuRgi`\yNy}:Z48T.ws:sAȥHԍ ;JH@bt j$ch%} L+j0{mVUaJ Pv ,a?:vWJ|_|Hμ4tBB6oYn|l=qz9{f裏?rZjgh/ !*>)Zx֨%_ED*,F pys]_z:ՌB<3tY7?$,>Wx,8LDzdV3TMGKnxqɿ%]\3c?8-Ip>$6F(36""-+ "ڢRTlD)sȞu]8|nč!-ZCՍ Ȭ3,ވ;JYq]pdF}8VTfYv|bp]9ُ($B%4^{0VϿmٗRYD=F{L:^ ŸZ q 4ަq_Ώ}㿃|-p7W5>՝$?Y[{T> 꺥H=3o\9N~YiLTF@Ox:6j|)qt~,$4{sGEY)c=܂?h@d9h{6R?hc_D|: s^s)!3/2ljBQ:/Up7СCϯ u%5;_tP59<Y|&_=`TzU.F鮪IyQ7 W/xm'k3./ IZ9#&ņ|޺蜱: ia.wG(T9uрb y ,&*!EJjӝ:y[ooաxH4>x/xwq:–Fm4)P]XtVa$p`s~:;TȔt\@nȷWMfwCFn1\!&+T7Ckk>4~ o[u8q/ nL8,.q˅9es!zx@QL{v生 #=ͦǼfKj^:7Hک0Â7A( c5ai^mcO'`ŢѤ{D I @q$1EGv/8tS1N׎ 'C&2cׂжs"Gh! =^% ~RNN]B4#튲m.b:=;{vN{zϭȯΆMaPM(PUHZ PcFY-u].~=rVX=@~zAYhryTuY""mET^܏9״⋆sǁN $n.cqs3wF$)A3lԞV I^VC~oĿDm%JS7JfFā;j맾-İYm vBwM.(J` NEeHeC@PD%NMdw^(aT()$vD1FiAMAFQXTOicPW݃R)hJYQ c@6+s'ޞmS4 $7k$8zJ$W{  wxLѿ~h}c㑓'O~;-]vK\p Kϻy~ B%8R(p!]!:1&_PAh+IGoXljǡ3?ukugɋ0 >="amѓ0`N4Udu~+HMiėbo.SǾVU-Ȯ? pPѴ9EJLN5RR!]_}= =_oMt5> iLF7K)h< 1;]=%CDscq>N#Uj ]OϠ?fda ᕱfOs7:Ikbs^وP͊X)y]Nݼ:rl|=lώ\=Cޘk&٤ņ`i~m2\E48,T}߿5㜋~(~~wqXZ?;vW"~KPdW^Fo5 5cḱZ82JMw::مJ# IDATzBb'sf Ցx:GAdwg,K/DY3)נ05?lߙ31:D> *}9? {=aRwqŨ&Bj7p{6gُ_o{x> ~ؿ?>/|}s@B 7Y1DC@ !Ց'k GUk8q$J/C=-Kjs?t ]duTuZ7U %;F+6tmC /"'wrD́_+ NJ2nKT {]}QGGjBغG)8cF扝J k9Ȃ٠w2so-Eq7nܻ0bǵI {a<)0E20W:ޫ嵨E$x¤I\df$vMJ8{rq\hËTK fs?vS5^ a:Ʃ?wͿ9_}9}V~Nomt6{H5~R"A̳U6ҴJ,-i"PCa/sԚ5wJl-gl]MTHF"H|y7RbpU΍~n[ F=Qȟф_(qGhiy:r#&N_╛wzd[ "/<%אQk9 ۱ !vL[[=?j7Ṿuy߽a%313GƷyɚ9,) j(D4H'wEVwR3uӷOI^S* gq!J#-.8Q9,i|(tI#<{1Ҧ^phUb$Gg:X=wO r ;/^3pxqѮ'NNUD[k12MKӥTcZBTП>$`$ z 71|UbHSBpQ+Z6xјO@뼱.)9ih G#uoe| tQhqAV6"Y<#9GR 4غjBw蚋>w/v(>G.u>}0{1/Y Yy͝u)<wʑ3-p"¥$j>h3qT߹Vpm)Ŭɒ)|r1Ldo$H魐ļO]b" 3ib=g3oȟ~> ~| X]vNomt6׊f 5cХ[^ʻ@: ,H5jK'c|gi >^]RH \8G?.ԦN4g>RfP\'4D" TnCdi.8 l(]H+vʬ4o %wmP8 gku/O.>n\} GZOeG// rxO 3`ޕ-wTQiv?j@gd~a}tB Pm{h/<(#-Pה_T~ǒ3 @v68_kRDi{5RT1#Vhv~މ0X!H`C^hQ&B5ƾǤ -?t~檃? p=_}ѣGq饗s;x唢g+L :w<]3Ǚ=۽mΎ6`"Tl:{wֆΙz:SUD4wjͽCVCLUjߒlW PL@b,p҄) 4${*,H|aIGTy6Er un>{' ZKx6{E޽7s?iM{; gP!_9c=Z5qU#+Is70:tYixfu%{D/\^TTڽ{WiL7jPr Us5&%Ӿ@$u=BŗL)kvߍ={.y>J)RS]U2׿w݂gtlȎu]zAE!R'>Rzԗa`w=W<#k;wBI|&[/'=:ub%NU9T™׾㏢:EYpv̗zaka޺~N .~L]ox w/Y__t:kw{{42$Qxy1b-&< Gөsy"A7 =B5F(ш֪) Z2EcO%6cL}5ZI.zD`e3ZH&u fE oE1I㺰5[u#NVbD8xCM}R+h.ӰW7nEUbl6ӧ?|{zW׿ vweuU*3St~A%_Uqbq~sT|\+h vLqsIY2u#_C6`A#o_S2OH4` (}Lf\Y1Zs PU%ggфr ӯȏnrBMCQ VA5M5J%T'{Omz\sᯝ:unMfIܞ^ǂHZe=%h%c}2tV#s5k{)/k6<"gL\XҨRT*vr| 9ӦTii6hhC53<bΑw,]&\=8t-ӧ2rKaCH.XTbA'}MK@1UW'O^ϷyY|8xUEt-ܹz%uz+^x8ttn~ҍKKK' [xuϯXɺ"+*WJx i(%rWVں*`^h#01oQ*30ܺZJe͑Y۶Bb=MoM,F57&Le;B-!x-BPH@rSAhGA`e1]k`摉FiSQ̆/om o=pGom8G /~e[o=ouu奵dTR*QF?TEL4کH!egL,m42P:`~F!CX2.{LbwftU< 5IQE*ɳF٦;g+`y  S4iZ;!DHNzI$GsK]#R9= LiUHPuj+RUrn޾at<݉.| @]n睿rMXbRC 4EMS1(z Fdך˸P&ݞfFV;pL3L"h!u| Y8U;jtE E]a'`[@m2oa5֫\AT&$ѡE87Q)?iEIz+-%" <`0N:)W\yB^ vm8pw^r%K˓h7sX K'o|p L7=OLIF6ݮz\y!!ED{PeЏƌ.#z-k_-| ƙ>q˶CIoSe,oÑ$6Q;ʆ(z.#&v~,%\LqTqg~1t:>u+|^(o ppۭmzǮ9y͡z.I)74hl[*ϵm]d8ڬN1o:` ,XuCoﺂ"ɽݤi~y%B>ك/Hs9VYP1)./4Ya1qb\.ޖ~S.y#j#!- Gp((BfTT7Noĩ'>x問vm/U@_Vwߦ 2ЪvmN%Ͽ}.V+}Ɋ%i "ΫӄJ0&){>ЪTCRi` a 9U=J1ᨨZuQ_8O>HM\\9ۦ.uaOU?q>POGx*W8usGu4 !@$o8r EϿ???q+ /IUEO13«ˣި5ޥ)Ԅ̓ &X o0I*0*%Pz*?YudYu=Umɦ'>dȱ})A}lLˡ$g?r(=7FKiSXf`ܻGqKS; s}}8.ٽ.?Kė5#xj'\Sjd94D$' |O5r Oz %ʇMugϑ[_KV]^@"[cю0T=@.wU^{Lj;׭hn1JG,g'0!Hdk>r+RIe Fn%ǻ.{={^ȏ {oQU;D}2.--#4L-lhJk)!V@M%dZ3mQv%B$TUb]}|:G9s:jy?h7w/mxQ9 R9q9؛͛XhdGM?74[qt6pτgp78~8vJ#G^|yÓ@ˢh )kp|x'e)(^%HMؠV܊0c3v+iۍ6' =QgiRQn_$VEkɼgvXxۤ7x|:&rf7FYjEdis n.ܚ6TZ"Z?ӛ'v՟?.bxt^xMEݸ1>AD<⮁Vɩ3]]ث"%0\J,Bd>+etxìT*sڨSÛRRLZKNcL;bT& My_#a NL9ГX𺸴eQ; aL0:/!u]/ESo۳Gp=+˓L&oUIF QE?x>fhew414`!FR0F䖖tbRD:9x/U[:ָm2-PBo%uT8#;?bX@`i\~)Ov"(Hi:b6~teeٳ3q/xNjyq-~w}A#=ovo;!47z_hy*,-.w/͋> l_F{R}6z(~*07OŒ2<|d齁r(y`&n0Tá?~zO>t}>]8k׮]'ovܱƿɌТM/rTEPs@BM0,ԍv8S^꭬f"ZzeM% Gpwhm>\{[o{V[}ɎKV`mPc|PF@Fl3$CDz(q:CPce e11㕓^x-֢ƙ-  4Ns?&'MœW} S\sgZAʸ-" )x]@,LCM緶fN>u+~5o{ۋyqV~++ӛ}}Ʃl IIkQlɰɫ5e% ƝCg8~l 7<JdgMD^Q*)a). 7T8EDQ$*u&[oˤ(X,e6=#Ҡx|O+aKWcnk(۞dpb2N0@_\]]}Wu7࡫rw]xޅKזxR>: a}pp 6v\N8ݿەKRDYֺYjJL t}O 1'~ܧ”@3ġ`v@j{xԘZQL-)EХB1"'f0E0@3GOܸ+?M7>s IDAT:X+zя(;v{y/LhBPrP{-1j4DPqAdγ;kAoO"ċe&V6rLP%u'УEЄ2>WM8)"SDj``OM e V 3QAg@*Q 'hMNGg9amAzyͿWO]t=+_[^"˘'icTWu$̈8;*@I@j|-qT2= ?oQ6MY%KopޞJvը>Ys1eNcZN(vsF`;")}Xr88<.AAӊ&L ?#___n?7 ߴ7uk/]/xd>gm|%!e&,UB+N ^%BhG.*ŜozM(r2^w tJmjS%JzEgkL\NVSC1 ~HJ4$ " ApD^hSf*~g'Z߮۱&;.(} za 4֜ U8O|([u٦K 1L?پz ft:(IEo+BF5dۧ[EG JjhCWե#L gAinS8ƩZZ]ѷ\z~;߿}o/u1t/yrW)ӷ%gY7m1"rKDZfʑc @_3 XJ^S>R39QAO@$nG޿&IT"qN I*!2KY7ŚpJ?/^{wOvdcǎa޽77c\?~k޲R.Џ@3Ebv"R"8[$dc>Q,$!Kȩa&T;jG%7LjV'+f-Ȥ%p>pK֒+vtangĄÒ=%F,DDIDg^[{M_ݻ/o{xJnc ?~{lv/ЯbF`n`5H12 (DA/= )C䋢";H[LLvGP( -dRҕDj w!q)LX[k\5Q=⋿_q{`m%É's><'vZgw; @pQD?)Ơi țD$b҄Ҍ+\0fp饗~龿v.;_c'O 0.0) colour_alpha /= combined_alpha; gl_FragColor = gl_Color * vec4(vec3(colour_alpha), combined_alpha); } gource-0.54/data/shaders/shadow.vert0000644002342600234260000000017014362112040017306 0ustar andrewcandrewcvoid main(void) { gl_TexCoord[0] = gl_MultiTexCoord0; gl_FrontColor = gl_Color; gl_Position = ftransform(); } gource-0.54/m4/0000755002342600234260000000000014362112040013077 5ustar andrewcandrewcgource-0.54/m4/ax_save_flags_with_prefix.m40000644002342600234260000000556014362112040020561 0ustar andrewcandrewc# ============================================================================== # https://www.gnu.org/software/autoconf-archive/ax_save_flags_with_prefix.html # ============================================================================== # # SYNOPSIS # # AX_SAVE_FLAGS_WITH_PREFIX(PREFIX, LIST-OF-FLAGS) # # DESCRIPTION # # For each flag in LIST-OF-FLAGS, it expands to lower-cased shell variable # with the prefix holding the flag original value. The saved variables # can be restored by AX_RESTORE_FLAGS_WITH_PREFIX # # As an example: AX_SAVE_FLAGS_WITH_PREFIX([GL], [[CFLAGS],[LIBS]]) # expands to # # gl_saved_flag_cflags="$CFLAGS" # gl_saved_flag_libs="$LIBS" # CFLAGS="$GL_CFLAGS $CFLAGS" # LIBS="$GL_LIBS $LIBS" # # One common use case is to define a package specific wrapper macro around # this one, and also setup other variables if needed. For example: # # AC_DEFUN([_AX_CHECK_GL_SAVE_FLAGS], [ # AX_SAVE_FLAGS_WITH_PREFIX([GL],[$1]) # AC_LANG_PUSH([C]) # ]) # # # pushes GL_CFLAGS and GL_LIBS to CFLAGS and LIBS # # also set the current language to test to C # _AX_CHECK_GL_SAVE_FLAGS([[CFLAGS],[LIBS]]) # # LICENSE # # Copyright (c) 2016 Felix Chern # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 3 AC_DEFUN([AX_SAVE_FLAGS_WITH_PREFIX],[ m4_ifval([$2], [ _ax_[]m4_tolower($1)_saved_flag_[]m4_tolower(m4_car($2))="$m4_car($2)" m4_car($2)="$$1_[]m4_car($2) $m4_car($2)" $0($1, m4_cdr($2)) ])]) gource-0.54/m4/ax_boost_system.m40000644002342600234260000001014414362112040016563 0ustar andrewcandrewc# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_boost_system.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_SYSTEM # # DESCRIPTION # # Test for System library from the Boost C++ libraries. The macro requires # a preceding call to AX_BOOST_BASE. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_SYSTEM_LIB) # # And sets: # # HAVE_BOOST_SYSTEM # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2008 Michael Tindal # Copyright (c) 2008 Daniel Casimiro # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 20 AC_DEFUN([AX_BOOST_SYSTEM], [ AC_ARG_WITH([boost-system], AS_HELP_STRING([--with-boost-system@<:@=special-lib@:>@], [use the System library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-system=boost_system-gcc-mt ]), [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_system_lib="" else want_boost="yes" ax_boost_user_system_lib="$withval" fi ], [want_boost="yes"] ) if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_BUILD]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_CACHE_CHECK(whether the Boost::System library is available, ax_cv_boost_system, [AC_LANG_PUSH([C++]) CXXFLAGS_SAVE=$CXXFLAGS CXXFLAGS= AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[boost::system::error_category *a = 0;]])], ax_cv_boost_system=yes, ax_cv_boost_system=no) CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) ]) if test "x$ax_cv_boost_system" = "xyes"; then AC_SUBST(BOOST_CPPFLAGS) AC_DEFINE(HAVE_BOOST_SYSTEM,,[define if the Boost::System library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` LDFLAGS_SAVE=$LDFLAGS if test "x$ax_boost_user_system_lib" = "x"; then for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], [link_system="no"]) done if test "x$link_system" != "xyes"; then for libextension in `ls -r $BOOSTLIBDIR/boost_system* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], [link_system="no"]) done fi else for ax_lib in $ax_boost_user_system_lib boost_system-$ax_boost_user_system_lib; do AC_CHECK_LIB($ax_lib, exit, [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], [link_system="no"]) done fi if test "x$ax_lib" = "x"; then AC_MSG_ERROR(Could not find a version of the Boost::System library!) fi if test "x$link_system" = "xno"; then AC_MSG_ERROR(Could not link against $ax_lib !) fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) gource-0.54/m4/ax_check_gl.m40000644002342600234260000002612514362112040015576 0ustar andrewcandrewc# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_check_gl.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_GL([ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # Checks for an OpenGL implementation. If a valid OpenGL implementation is # found, this macro would set C preprocessor symbol HAVE_GL to 1. # # If either a valid OpenGL header or library was not found, by default the # configuration would exits on error. This behavior can be overwritten by # providing a custom "ACTION-IF-NOT-FOUND" hook. # # If the header, library was found, and been tested for compiling and # linking the configuration would export the required compiler flags to # "GL_CFLAGS" and "GL_LIBS". These two variables can also be overwritten # by user from the command line if they want to link against the library # they specified instead of having the configuration script to detect the # flags automatically. Note that having "GL_CFLAGS" or "GL_LIBS" set # doesn't mean it can compile or link with the flags, since it could be # overwritten by user. However the "HAVE_GL" symbol and "ACTION-IF-FOUND" # hook is always guaranteed to reflect a valid OpenGL implementation. # # If user didn't specify the "ACTION-IF-FOUND" hook, the configuration # would prepend "GL_CFLAGS" and "GL_LIBS" to "CFLAGS" and "LIBS", like # many other autoconf macros do. # # OpenGL is one of the libraries that has different header names on # different platforms. This macro does the header detection, and will # export the following symbol: "HAVE_GL_GL_H" for having "GL/gl.h" or # "HAVE_OPENGL_GL_H" for having "OpenGL/gl.h". To write a portable OpenGL # code, you should include OpenGL header like so: # # #if defined(HAVE_WINDOWS_H) && defined(_WIN32) # # include # #endif # #ifdef HAVE_GL_GL_H # # include # #elif defined(HAVE_OPENGL_GL_H) # # include # #else # # error no gl.h # #endif # # On the OSX platform, there's two possible OpenGL implementation. One is # the OpenGL that ships with OSX, the other comes with X11/XQuartz # (http://www.xquartz.org). To use the xquartz variant, user can use the # option --with-xquartz-gl[=path to xquartz root]. By default the # configuration will check "/opt/X11", which is the default X11 install # location on OSX. # # LICENSE # # Copyright (c) 2009 Braden McDaniel # Copyright (c) 2012 Bastien Roucaries # Copyright (c) 2016 Felix Chern # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 22 # example gl program m4_define([_AX_CHECK_GL_PROGRAM], [AC_LANG_PROGRAM([[ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GL_H # include # elif defined(HAVE_OPENGL_GL_H) # include # else # error no gl.h # endif ]],[[glBegin(0)]])]) dnl Default include : add windows.h dnl see http://www.opengl.org/wiki/Platform_specifics:_Windows dnl (acceded 20120801) AC_DEFUN([_AX_CHECK_GL_INCLUDES_DEFAULT],dnl [ AC_INCLUDES_DEFAULT [ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif ] ]) # _AX_CHECK_GL_SAVE_FLAGS(LIST-OF-FLAGS) # Use this macro before you modify the flags. # Restore the flags by _AX_CHECK_GL_RESTORE_FLAGS # # Example: _AX_CHECK_GL_SAVE_FLAGS([[CFLAGS],[LIBS]]) expands to # gl_saved_flag_cflags=$CFLAGS # gl_saved_flag_libs=$LIBS # CFLAGS="$GL_CFLAGS $CFLAGS" # LIBS="$GL_LIBS $LIBS" AC_DEFUN([_AX_CHECK_GL_SAVE_FLAGS], [ AX_SAVE_FLAGS_WITH_PREFIX([GL],[$1]) AC_LANG_PUSH([C]) ]) # _AX_CHECK_GL_RESTORE_FLAGS(LIST-OF-FLAGS) # Use this marcro to restore the flags you saved using # _AX_CHECK_GL_SAVE_FLAGS # # Example: _AX_CHECK_GL_RESTORE_FLAGS([[CFLAGS],[LIBS]]) expands to # CFLAGS="$gl_saved_flag_cflags" # LIBS="$gl_saved_flag_libs" AC_DEFUN([_AX_CHECK_GL_RESTORE_FLAGS], [ AX_RESTORE_FLAGS_WITH_PREFIX([GL],[$1]) AC_LANG_POP([C]) ]) # Check if the program compiles AC_DEFUN([_AX_CHECK_GL_COMPILE], [dnl _AX_CHECK_GL_SAVE_FLAGS([CFLAGS]) AC_COMPILE_IFELSE([_AX_CHECK_GL_PROGRAM], [ax_check_gl_compile_opengl="yes"], [ax_check_gl_compile_opengl="no"]) _AX_CHECK_GL_RESTORE_FLAGS([CFLAGS]) ]) # Compile the example program (cache) AC_DEFUN([_AX_CHECK_GL_COMPILE_CV], [dnl AC_CACHE_CHECK([for compiling a minimal OpenGL program],[ax_cv_check_gl_compile_opengl], [_AX_CHECK_GL_COMPILE() ax_cv_check_gl_compile_opengl="${ax_check_gl_compile_opengl}"]) ax_check_gl_compile_opengl="${ax_cv_check_gl_compile_opengl}" ]) # Link the example program AC_DEFUN([_AX_CHECK_GL_LINK], [dnl _AX_CHECK_GL_SAVE_FLAGS([[CFLAGS],[LIBS],[LDFLAGS]]) AC_LINK_IFELSE([_AX_CHECK_GL_PROGRAM], [ax_check_gl_link_opengl="yes"], [ax_check_gl_link_opengl="no"]) _AX_CHECK_GL_RESTORE_FLAGS([[CFLAGS],[LIBS],[LDFLAGS]]) ]) # Link the example program (cache) AC_DEFUN([_AX_CHECK_GL_LINK_CV], [dnl AC_CACHE_CHECK([for linking a minimal OpenGL program],[ax_cv_check_gl_link_opengl], [_AX_CHECK_GL_LINK() ax_cv_check_gl_link_opengl="${ax_check_gl_link_opengl}"]) ax_check_gl_link_opengl="${ax_cv_check_gl_link_opengl}" ]) # _AX_CHECK_GL_MANUAL_LIBS_GENERIC(LIBRARIES-TO-SEARCH) # Searches library provided in $1, and output the flag # $ax_check_gl_lib_opengl AC_DEFUN([_AX_CHECK_GL_MANUAL_LIBS_GENERIC], [ AS_IF([test -n "$GL_LIBS"],[], [ ax_check_gl_manual_libs_generic_extra_libs="$1" AS_IF([test "X$ax_check_gl_manual_libs_generic_extra_libs" = "X"], [AC_MSG_ERROR([AX_CHECK_GL_MANUAL_LIBS_GENERIC argument must no be empty])]) _AX_CHECK_GL_SAVE_FLAGS([CFLAGS]) AC_SEARCH_LIBS([glBegin],[$ax_check_gl_manual_libs_generic_extra_libs], [ ax_check_gl_lib_opengl="yes" break ]) AS_IF([test "X$ax_check_gl_lib_opengl"="Xyes"], [GL_LIBS="${ac_cv_search_glBegin}"]) _AX_CHECK_GL_RESTORE_FLAGS([CFLAGS]) ]) ]) # _WITH_XQUARTZ_GL # ---------------- # Provides an option in command line to specify the XQuartz installation # path on OSX, so that user can link to it instead of using the default # OSX OpenGL framework. (Mac OSX only) AC_DEFUN_ONCE([_WITH_XQUARTZ_GL],[ AC_ARG_WITH([xquartz-gl], [AS_HELP_STRING([--with-xquartz-gl@<:@=DIR@:>@], [On Mac OSX, use opengl provided by X11/XQuartz instead of the built-in framework. If enabled, the default location is @<:@DIR=/opt/X11@:>@. This option is default to false.])], [AS_IF([test "X$with_xquartz_gl"="Xyes"], [with_xquartz_gl="/opt/X11"])], [with_xquartz_gl=no]) AS_IF([test "X$with_xquartz_gl" != "Xno"], [AC_MSG_CHECKING([OSX X11 path]) AS_IF([test -e "$with_xquartz_gl"], [AC_MSG_RESULT(["$with_xquartz_gl"]) CFLAGS="-I$with_xquartz_gl/include $CFLAGS" LIBS="-L$with_xquartz_gl/lib $LIBS" ], [with_xquartz_gl=no AC_MSG_RESULT([no]) AC_MSG_WARN([--with-xquartz-gl was given, but test for X11 failed. Fallback to system framework]) ]) ]) ]) # OSX specific setup for OpenGL check AC_DEFUN([_AX_CHECK_DARWIN_GL], [ AC_REQUIRE([_WITH_XQUARTZ_GL]) AS_IF([test "x$with_xquartz_gl" != "xno"], [GL_LIBS="${GL_LIBS:--lGL}"], [GL_LIBS="${GL_LIBS:--framework OpenGL}"]) ]) # AX_CHECK_GL_LIB([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------- # Checks OpenGL headers and library and provides hooks for success and failures. # When $1 is not set, this macro would modify CFLAGS and LIBS environment variables. # However, user can override this behavior by providing their own hooks. # The CFLAGS and LIBS flags required by OpenGL is always exported in # GL_CFLAGS and GL_LIBS environment variable. # # In other words, the default behavior of AX_CHECK_GL_LIB() is equivalent to # AX_CHECK_GL_LIB( # [CFLAGS="$GL_CFLAGS $CFLAGS" # LIBS="$GL_LIBS $LIBS"] # ) AC_DEFUN([AX_CHECK_GL], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([PKG_PROG_PKG_CONFIG]) AC_ARG_VAR([GL_CFLAGS],[C compiler flags for GL, overriding configure script defaults]) AC_ARG_VAR([GL_LIBS],[Linker flags for GL, overriding configure script defaults]) dnl --with-gl or not can be implemented outside of check-gl AS_CASE([${host}], [*-darwin*],[_AX_CHECK_DARWIN_GL], dnl some windows may support X11 opengl, and should be able to linked dnl by -lGL. However I have no machine to test it. [*-cygwin*|*-mingw*],[ _AX_CHECK_GL_MANUAL_LIBS_GENERIC([opengl32 GL gl]) AC_CHECK_HEADERS([windows.h]) ], [PKG_PROG_PKG_CONFIG PKG_CHECK_MODULES([GL],[gl], [], [_AX_CHECK_GL_MANUAL_LIBS_GENERIC([GL gl])]) ]) dnl host specific checks dnl this was cache _AX_CHECK_GL_SAVE_FLAGS([CFLAGS]) AC_CHECK_HEADERS([GL/gl.h OpenGL/gl.h], [ax_check_gl_have_headers="yes";break]) _AX_CHECK_GL_RESTORE_FLAGS([CFLAGS]) AS_IF([test "X$ax_check_gl_have_headers" = "Xyes"], [_AX_CHECK_GL_COMPILE_CV()], [no_gl=yes]) AS_IF([test "X$ax_check_gl_compile_opengl" = "Xyes"], [_AX_CHECK_GL_LINK_CV()], [no_gl=yes]) AS_IF([test "X$no_gl" = "X"], [AC_DEFINE([HAVE_GL], [1], [Defined if a valid OpenGL implementation is found.]) m4_ifval([$1], [$1], [CFLAGS="$GL_CFLAGS $CFLAGS" LIBS="$GL_LIBS $LIBS"]) ], [m4_ifval([$2], [$2], [AC_MSG_ERROR([Could not find a valid OpenGL implementation])]) ]) ]) gource-0.54/m4/ax_check_glut.m40000644002342600234260000001747714362112040016161 0ustar andrewcandrewc# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_check_glut.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_GLUT([ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # Checks for GLUT. If a valid GLUT implementation is found, the configure # script would export the C preprocessor symbol "HAVE_GLUT=1". # # If either a valid GLUT header or library was not found, by default the # configure script would exit on error. This behavior can be overwritten # by providing a custom "ACTION-IF-NOT-FOUND" hook. # # If the header, library was found, and been tested for compiling and # linking the configuration would export the required compiler flags to # "GLUT_CFLAGS" and "GLUT_LIBS" environment variables. These two variables # can also be overwritten by defining the environment variables before # executing the configure program. If it was predefined, configure would # not try to overwrite it, but it would still perform the compile and link # test. Only when the tests succeeded does the configure script to export # "HAVE_GLUT=1" and to run "ACTION-IF-FOUND" hook. # # If user didn't specify the "ACTION-IF-FOUND" hook, the configuration # would prepend "GLUT_CFLAGS" and "GLUT_LIBS" to "CFLAGS" and "LIBS", like # many other autoconf macros do. # # If the header "GL/glut.h" is found, "HAVE_GL_GLUT_H" is defined. If the # header "GLUT/glut.h" is found, HAVE_GLUT_GLUT_H is defined. # # You should use something like this in your headers: # # # if HAVE_WINDOWS_H && defined(_WIN32) # # include # # endif # # if defined(HAVE_GL_GLUT_H) # # include # # elif defined(HAVE_GLUT_GLUT_H) # # include # # else # # error no glut.h # # endif # # On the OSX platform, you can use the option --with-xquartz-gl to use # X11/Xquartz GLUT implementation instead of the system built in GLUT # framework. # # LICENSE # # Copyright (c) 2009 Braden McDaniel # Copyright (c) 2013 Bastien Roucaries # Copyright (c) 2016 Felix Chern # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 17 AC_DEFUN([_AX_CHECK_GLUT_SAVE_FLAGS], [ AX_SAVE_FLAGS_WITH_PREFIX([GLUT],[$1]) dnl defined in ax_check_gl AC_LANG_PUSH([C]) ]) AC_DEFUN([_AX_CHECK_GLUT_RESTORE_FLAGS], [ AX_RESTORE_FLAGS_WITH_PREFIX([GLUT],[$1]) dnl defined in ax_check_gl AC_LANG_POP([C]) ]) dnl Default include : add windows.h dnl see http://www.opengl.org/wiki/Platform_specifics:_Windows dnl (acceded 20120801) AC_DEFUN([_AX_CHECK_GLUT_INCLUDES_DEFAULT],dnl [ AC_INCLUDES_DEFAULT [ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif ] ]) m4_define([_AX_CHECK_GLUT_PROGRAM], [AC_LANG_PROGRAM([[ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLUT_H # include # elif defined(HAVE_GLUT_GLUT_H) # include # else # error no glut.h # endif]], [[glutMainLoop()]])]) # _AX_CHECK_GLUT_MANUAL_LIBS_GENERIC(LIST-OF-LIBS) # ------------------------------------------------ # Searches libraries provided in $1, and export variable # $ax_check_glut_lib_glut AC_DEFUN([_AX_CHECK_GLUT_MANUAL_LIBS_GENERIC], [ _AX_CHECK_GLUT_SAVE_FLAGS([[CFLAGS],[LIBS]]) AC_SEARCH_LIBS([glutMainLoop],[$1], [GLUT_LIBS="${GLUT_LIBS:-$ac_cv_search_glutMainLoop}"]) _AX_CHECK_GLUT_RESTORE_FLAGS([[CFLAGS],[LIBS]]) ]) # Wrapper macro to check GLUT header AC_DEFUN([_AX_CHECK_GLUT_HEADER],[ _AX_CHECK_GLUT_SAVE_FLAGS([CFLAGS]) AC_CHECK_HEADERS([$1], [ax_check_glut_have_headers=yes]) _AX_CHECK_GLUT_RESTORE_FLAGS([CFLAGS]) ]) # AX_CHECK_GLUT_LIB([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------- # Checks GLUT headers and library and provides hooks for success and failures. AC_DEFUN([AX_CHECK_GLUT], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([_WITH_XQUARTZ_GL]) AC_ARG_VAR([GLUT_CFLAGS],[C compiler flags for GLUT, overriding configure script defaults]) AC_ARG_VAR([GLUT_LIBS],[Linker flags for GLUT, overriding configure script defaults]) AS_CASE([${host}], [*-darwin*],[AS_IF([test "x$with_xquartz_gl" != "xno"], [GLUT_LIBS="${GLUT_LIBS:--lGLUT}"], [GLUT_LIBS="${GLUT_LIBS:--framework GLUT}"])], [*-cygwin*|*-mingw*],[ _AX_CHECK_GLUT_MANUAL_LIBS_GENERIC([glut32 glut]) AC_CHECK_HEADERS([windows.h]) ], [_AX_CHECK_GLUT_MANUAL_LIBS_GENERIC([glut]) ]) dnl host specific checks dnl checks header AS_CASE([${host}], [*-darwin*],[AS_IF([test "x$with_xquartz_gl" = "xno"], [_AX_CHECK_GLUT_HEADER([GLUT/glut.h])], [_AX_CHECK_GLUT_HEADER([GL/glut.h])] )], [_AX_CHECK_GLUT_HEADER([GL/glut.h])]) dnl compile AS_IF([test "X$ax_check_glut_have_headers" = "Xyes"], [AC_CACHE_CHECK([for compiling a minimal GLUT program], [ax_cv_check_glut_compile], [_AX_CHECK_GLUT_SAVE_FLAGS([CFLAGS]) AC_COMPILE_IFELSE([_AX_CHECK_GLUT_PROGRAM], [ax_cv_check_glut_compile="yes"], [ax_cv_check_glut_compile="no"]) _AX_CHECK_GLUT_RESTORE_FLAGS([CFLAGS]) ]) ]) dnl link AS_IF([test "X$ax_cv_check_glut_compile" = "Xyes"], [AC_CACHE_CHECK([for linking a minimal GLUT program], [ax_cv_check_glut_link], [_AX_CHECK_GLUT_SAVE_FLAGS([[CFLAGS],[LIBS]]) AC_LINK_IFELSE([_AX_CHECK_GLUT_PROGRAM], [ax_cv_check_glut_link="yes"], [ax_cv_check_glut_link="no"]) _AX_CHECK_GLUT_RESTORE_FLAGS([[CFLAGS],[LIBS]]) ]) ]) dnl hook AS_IF([test "X$ax_cv_check_glut_link" = "Xyes"], [AC_DEFINE([HAVE_GLUT], [1], [Defined if a valid GLUT implementation is found]) m4_ifval([$1], [$1], [CFLAGS="$GLUT_CFLAGS $CFLAGS" LIBS="$GLUT_LIBS $LIBS"]) ], [m4_ifval([$2], [$2], [AC_MSG_ERROR([Could not find a valid GLUT implementation])] ) ]) ]) gource-0.54/m4/ax_pthread.m40000644002342600234260000002576114362112040015473 0ustar andrewcandrewc# =========================================================================== # http://www.nongnu.org/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). (This # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also link it with them as well. e.g. you should link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threads programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name # (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # # This program is free software: you can 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, 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. AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) AC_MSG_RESULT($ax_pthread_ok) if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" ;; esac if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include static void routine(void* a) {a=0;} static void* start_routine(void* a) {return a;}], [pthread_t th; pthread_attr_t attr; pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_create(&th,0,start_routine,0); pthread_cleanup_pop(0); ], [ax_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($ax_pthread_ok) if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr; return attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl AX_PTHREAD gource-0.54/m4/ax_boost_base.m40000644002342600234260000003306414362112040016157 0ustar andrewcandrewc# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_boost_base.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # Test for the Boost C++ libraries of a particular version (or newer) # # If no path to the installed boost library is given the macro searchs # under /usr, /usr/local, /opt, /opt/local and /opt/homebrew and evaluates # the $BOOST_ROOT environment variable. Further documentation is available # at . # # This macro calls: # # AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS) # # And sets: # # HAVE_BOOST # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2009 Peter Adolphs # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 51 # example boost program (need to pass version) m4_define([_AX_BOOST_BASE_PROGRAM], [AC_LANG_PROGRAM([[ #include ]],[[ (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))])); ]])]) AC_DEFUN([AX_BOOST_BASE], [ AC_ARG_WITH([boost], [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], [use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) @<:@ARG=yes@:>@ ])], [ AS_CASE([$withval], [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""], [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""], [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"]) ], [want_boost="yes"]) AC_ARG_WITH([boost-libdir], [AS_HELP_STRING([--with-boost-libdir=LIB_DIR], [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.])], [ AS_IF([test -d "$withval"], [_AX_BOOST_BASE_boost_lib_path="$withval"], [AC_MSG_ERROR([--with-boost-libdir expected directory name])]) ], [_AX_BOOST_BASE_boost_lib_path=""]) BOOST_LDFLAGS="" BOOST_CPPFLAGS="" AS_IF([test "x$want_boost" = "xyes"], [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])]) AC_SUBST(BOOST_CPPFLAGS) AC_SUBST(BOOST_LDFLAGS) ]) # convert a version string in $2 to numeric and affect to polymorphic var $1 AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[ AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"]) _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'` _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'` AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"], [AC_MSG_ERROR([You should at least specify libboost major version])]) _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'` AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"], [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"]) _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"], [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"]) _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET) ]) dnl Run the detection of boost should be run only if $want_boost AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[ _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1]) succeeded=no AC_REQUIRE([AC_CANONICAL_HOST]) dnl On 64-bit systems check for system libraries in both lib64 and lib. dnl The former is specified by FHS, but e.g. Debian does not adhere to dnl this (as it rises problems for generic multi-arch support). dnl The last entry in the list is chosen by default when no libraries dnl are found, e.g. when only header-only libraries are installed! AS_CASE([${host_cpu}], [x86_64],[libsubdirs="lib64 libx32 lib lib64"], [mips*64*],[libsubdirs="lib64 lib32 lib lib64"], [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64|e2k],[libsubdirs="lib64 lib lib64"], [libsubdirs="lib"] ) dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give dnl them priority over the other paths since, if libs are found there, they dnl are almost assuredly the ones desired. AS_CASE([${host_cpu}], [i?86],[multiarch_libsubdir="lib/i386-${host_os}"], [armv7l],[multiarch_libsubdir="lib/arm-${host_os}"], [multiarch_libsubdir="lib/${host_cpu}-${host_os}"] ) dnl first we check the system location for boost libraries dnl this location is chosen if boost libraries are installed with the --layout=system option dnl or if you install boost with RPM AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[ AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"]) AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[ AC_MSG_RESULT([yes]) BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"]) AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[ AC_MSG_RESULT([yes]) BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; break; ], [AC_MSG_RESULT([no])]) done],[ AC_MSG_RESULT([no])]) ],[ if test X"$cross_compiling" = Xyes; then search_libsubdirs=$multiarch_libsubdir else search_libsubdirs="$multiarch_libsubdir $libsubdirs" fi for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local /opt/homebrew ; do if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then for libsubdir in $search_libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" break; fi done ]) dnl overwrite ld flags if we have required special directory with dnl --with-boost-libdir parameter AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"], [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"]) AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version if test "x$succeeded" != "xyes" ; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then BOOST_LDFLAGS= fi _version=0 if test -n "$_AX_BOOST_BASE_boost_path" ; then if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" done dnl if nothing found search for layout used in Windows distributions if test -z "$BOOST_CPPFLAGS"; then if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" fi fi dnl if we found something and BOOST_LDFLAGS was unset before dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here. if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then for libsubdir in $libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" fi fi else if test "x$cross_compiling" != "xyes" ; then for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local /opt/homebrew ; do if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp best_path=$_AX_BOOST_BASE_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test -n "$BOOST_ROOT" ; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) fi if test "x$succeeded" != "xyes" ; then if test "x$_version" = "x0" ; then AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) else AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) fi # execute ACTION-IF-NOT-FOUND (if present): ifelse([$3], , :, [$3]) else AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) # execute ACTION-IF-FOUND (if present): ifelse([$2], , :, [$2]) fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" ]) gource-0.54/m4/ax_restore_flags_with_prefix.m40000644002342600234260000000513514362112040021304 0ustar andrewcandrewc# ================================================================================= # https://www.gnu.org/software/autoconf-archive/ax_restore_flags_with_prefix.html # ================================================================================= # # SYNOPSIS # # AX_RESTORE_FLAGS_WITH_PREFIX(PREFIX, LIST-OF-FLAGS) # # DESCRIPTION # # Restore the flags saved by AX_SAVE_FLAGS_WITH_PREFIX. # # Expansion example: AX_RESTORE_FLAGS_WITH_PREFIX([GL], [[CFLAGS],[LIBS]]) # expands to # # CFLAGS="$gl_saved_flag_cflags" # LIBS="$gl_saved_flag_libs" # # One common use case is to define a package specific wrapper macro around # this one, and also restore other variables if needed. For example: # # AC_DEFUN([_AX_CHECK_GL_RESTORE_FLAGS], [ # AX_RESTORE_FLAGS_WITH_PREFIX([GL],[$1]) # AC_LANG_POP([C]) # ]) # # # Restores CFLAGS, LIBS and language state # _AX_CHECK_GL_RESTORE_FLAGS([[CFLAGS],[LIBS]]) # # LICENSE # # Copyright (c) 2016 Felix Chern # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 3 AC_DEFUN([AX_RESTORE_FLAGS_WITH_PREFIX],[ m4_ifval([$2], [ m4_car($2)="$_ax_[]m4_tolower($1)_saved_flag_[]m4_tolower(m4_car($2))" $0($1, m4_cdr($2))]) ]) gource-0.54/m4/pkg.m40000644002342600234260000001214514362112040014125 0ustar andrewcandrewc# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # 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)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl 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. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure 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_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi 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 _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [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 ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [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 .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES gource-0.54/m4/ax_check_glu.m40000644002342600234260000002502114362112040015755 0ustar andrewcandrewc# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_check_glu.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_GLU([ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # Checks for GLUT. If a valid GLU implementation is found, the configure # script would export the C preprocessor symbol "HAVE_GLU=1". # # If either a valid GLU header or library was not found, by default the # configure script would exit on error. This behavior can be overwritten # by providing a custom "ACTION-IF-NOT-FOUND" hook. # # If the header, library was found, and been tested for compiling and # linking the configuration would export the required compiler flags to # "GLU_CFLAGS" and "GLU_LIBS" environment variables. These two variables # can also be overwritten by defining the environment variables before # executing the configure program. If it was predefined, configure would # not try to overwrite it, but it would still perform the compile and link # test. Only when the tests succeeded does the configure script to export # "HAVE_GLU=1" and to run "ACTION-IF-FOUND" hook. # # If user didn't specify the "ACTION-IF-FOUND" hook, the configuration # would prepend "GLU_CFLAGS" and "GLU_LIBS" to "CFLAGS" and "LIBS", like # many other autoconf macros do. # # If the header "GL/glu.h" is found, "HAVE_GL_GLU_H" is defined. If the # header "OpenGL/glu.h" is found, HAVE_OPENGL_GLU_H is defined. # # You should use something like this in your headers: # # # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # # include # # endif # # if defined(HAVE_GL_GLU_H) # # include # # elif defined(HAVE_OPENGL_GLU_H) # # include # # else # # error no glu.h # # endif # # On the OSX platform, you can use the option --with-xquartz-gl to use # X11/Xquartz GLU implementation instead of the system built in GLU # framework. # # Some implementations (in particular, some versions of Mac OS X) are # known to treat the GLU tesselator callback function type as "GLvoid # (*)(...)" rather than the standard "GLvoid (*)()". If the former # condition is detected, this macro defines "HAVE_VARARGS_GLU_TESSCB". # # LICENSE # # Copyright (c) 2009 Braden McDaniel # Copyright (c) 2013 Bastien Roucaries # Copyright (c) 2016 Felix Chern # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 23 # example program m4_define([_AX_CHECK_GLU_PROGRAM], [AC_LANG_PROGRAM([[ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLU_H # include # elif defined(HAVE_OPENGL_GLU_H) # include # else # error no glu.h # endif ]],[[gluBeginCurve(0)]])]) dnl Default include : add windows.h dnl see http://www.opengl.org/wiki/Platform_specifics:_Windows dnl (acceded 20120801) AC_DEFUN([_AX_CHECK_GLU_INCLUDES_DEFAULT],dnl [ AC_INCLUDES_DEFAULT [ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif ] ]) # check tesselation callback function signature. m4_define([_AX_CHECK_GLU_VARARGS_TESSVB_PROGRAM], [AC_LANG_PROGRAM([[ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLU_H # include # elif defined(HAVE_OPENGL_GLU_H) # include # else # error no glu.h # endif ]], [[GLvoid (*func)(...); gluTessCallback(0, 0, func)]]) ]) # _AX_CHECK_GLU_SAVE_FLAGS(LIST-OF-FLAGS,[LANG]) # ---------------------------------------------- # Save the flags to shell variables. # Example: _AX_CHECK_GLU_SAVE_FLAGS([[CFLAGS],[LIBS]]) expands to # AC_LANG_PUSH([C]) # glu_saved_flag_cflags=$CFLAGS # glu_saved_flag_libs=$LIBS # CFLAGS="$GLU_CFLAGS $CFLAGS" # LIBS="$GLU_LIBS $LIBS" # # Can optionally support other LANG by specifying $2 AC_DEFUN([_AX_CHECK_GLU_SAVE_FLAGS], [ m4_ifval([$2], [AC_LANG_PUSH([$2])], [AC_LANG_PUSH([C])]) AX_SAVE_FLAGS_WITH_PREFIX([GLU],[$1]) dnl defined in ax_check_gl ]) # _AX_CHECK_GLU_RESTORE_FLAGS(LIST-OF-FLAGS) # Use this marcro to restore the flags you saved using # _AX_CHECK_GLU_SAVE_FLAGS # # Example: _AX_CHECK_GLU_RESTORE_FLAGS([[CFLAGS],[LIBS]]) expands to # CFLAGS="$glu_saved_flag_cflags" # LIBS="$glu_saved_flag_libs" # AC_LANG_POP([C]) AC_DEFUN([_AX_CHECK_GLU_RESTORE_FLAGS], [ AX_RESTORE_FLAGS_WITH_PREFIX([GLU],[$1]) dnl defined in ax_check_gl m4_ifval([$2], [AC_LANG_POP([$2])], [AC_LANG_POP([C])]) ]) # Search headers and export $ax_check_glu_have_headers AC_DEFUN([_AX_CHECK_GLU_HEADERS], [ _AX_CHECK_GLU_SAVE_FLAGS([CFLAGS]) AC_CHECK_HEADERS([$1], [ax_check_glu_have_headers="yes";], [], [_AX_CHECK_GLU_INCLUDES_DEFAULT()]) _AX_CHECK_GLU_RESTORE_FLAGS([CFLAGS]) ]) # _AX_CHECK_GLU_SEARCH_LIBS(LIBS) # ------------------------------- # Search for a valid GLU lib from $1 and set # GLU_LIBS respectively AC_DEFUN([_AX_CHECK_GLU_SEARCH_LIBS], [ _AX_CHECK_GLU_SAVE_FLAGS([[CFLAGS],[LIBS]]) AC_SEARCH_LIBS([gluBeginCurve],[$1], [GLU_LIBS="${GLU_LIBS:-$ac_cv_search_gluBeginCurve}"]) _AX_CHECK_GLU_RESTORE_FLAGS([[CFLAGS],[LIBS]]) ]) # OSX specific GLU checks AC_DEFUN([_AX_CHECK_DARWIN_GLU], [ AC_REQUIRE([_WITH_XQUARTZ_GL]) AS_IF([test "x$with_xquartz_gl" != "xno"], [GLU_LIBS="${GLU_LIBS:--lGLU}"], [GLU_LIBS="${GLU_LIBS:--framework OpenGL}"]) ]) # AX_CHECK_GLU([ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) # ----------------------------------------------------- # Checks GLU and provides hooks for success and failures AC_DEFUN([AX_CHECK_GLU],[ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([_WITH_XQUARTZ_GL]) AC_REQUIRE([PKG_PROG_PKG_CONFIG]) AC_ARG_VAR([GLU_CFLAGS],[C compiler flags for GLU, overriding system check]) AC_ARG_VAR([GLU_LIBS],[Linker flags for GLU, overriding system check]) dnl Setup GLU_CFLAGS and GLU_LIBS AS_CASE([${host}], [*-darwin*],[_AX_CHECK_DARWIN_GLU], [*-cygwin*],[_AX_CHECK_GLU_SEARCH_LIBS([GLU glu MesaGLU glu32]) AC_CHECK_HEADERS([windows.h])], # try first native [*-mingw*],[_AX_CHECK_GLU_SEARCH_LIBS([glu32 GLU glu MesaGLU]) AC_CHECK_HEADERS([windows.h])], [PKG_PROG_PKG_CONFIG PKG_CHECK_MODULES([GLU],[glu], [], [_AX_CHECK_GLU_SEARCH_LIBS([GLU glu MesaGLU])]) ]) AS_CASE([$host], [*-darwin*], [AS_IF([test "X$with_xquartz_gl" = "Xno"], [_AX_CHECK_GLU_HEADERS([OpenGL/glu.h])], [_AX_CHECK_GLU_HEADERS([GL/glu.h])] )], [_AX_CHECK_GLU_HEADERS([GL/glu.h])]) dnl compile test AS_IF([test "X$ax_check_glu_have_headers" = "Xyes"], [AC_CACHE_CHECK([for compiling a minimal OpenGL Utility (GLU) program], [ax_cv_check_glu_compile], [_AX_CHECK_GLU_SAVE_FLAGS([CFLAGS]) AC_COMPILE_IFELSE([_AX_CHECK_GLU_PROGRAM], [ax_cv_check_glu_compile="yes"], [ax_cv_check_glu_compile="no"]) _AX_CHECK_GLU_RESTORE_FLAGS([CFLAGS])]) ]) dnl link test AS_IF([test "X$ax_cv_check_glu_compile" = "Xyes"], [AC_CACHE_CHECK([for linking a minimal GLU program], [ax_cv_check_glu_link], [_AX_CHECK_GLU_SAVE_FLAGS([[CFLAGS],[LIBS]]) AC_LINK_IFELSE([_AX_CHECK_GLU_PROGRAM], [ax_cv_check_glu_link="yes"], [ax_cv_check_glu_link="no"]) _AX_CHECK_GLU_RESTORE_FLAGS([[CFLAGS],[LIBS]])]) ]) # # Some versions of Mac OS X include a broken interpretation of the GLU # tesselation callback function signature. AS_IF([test "X$ax_cv_check_glu_link" = "Xyes"], [AC_CACHE_CHECK([if GLU varargs tesselator is using non-standard form], [ax_cv_varargs_glu_tesscb], [_AX_CHECK_GLU_SAVE_FLAGS([CFLAGS],[C++]) AC_COMPILE_IFELSE([_AX_CHECK_GLU_VARARGS_TESSVB_PROGRAM], [ax_cv_varargs_glu_tesscb="yes"], [ax_cv_varargs_glu_tesscb="no"]) _AX_CHECK_GLU_RESTORE_FLAGS([CFLAGS],[C++])]) AS_IF([test "X$ax_cv_varargs_glu_tesscb" = "yes"], [AC_DEFINE([HAVE_VARARGS_GLU_TESSCB], [1], [Use nonstandard varargs form for the GLU tesselator callback])]) ]) dnl hook AS_IF([test "X$ax_cv_check_glu_link" = "Xyes"], [AC_DEFINE([HAVE_GLU],[1],[Defined if a valid GLU implementation is found.]) m4_ifval([$1], [$1], [CFLAGS="$GLU_CFLAGS $CFLAGS" LIBS="$GLU_LIBS $LIBS"])], [m4_ifval([$2], [$2], [AC_MSG_ERROR([Could not find a valid GLU implementation])]) ]) ]) gource-0.54/m4/ax_boost_filesystem.m40000644002342600234260000001046114362112040017425 0ustar andrewcandrewc# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_FILESYSTEM # # DESCRIPTION # # Test for Filesystem library from the Boost C++ libraries. The macro # requires a preceding call to AX_BOOST_BASE. Further documentation is # available at . # # This macro calls: # # AC_SUBST(BOOST_FILESYSTEM_LIB) # # And sets: # # HAVE_BOOST_FILESYSTEM # # LICENSE # # Copyright (c) 2009 Thomas Porschberg # Copyright (c) 2009 Michael Tindal # Copyright (c) 2009 Roman Rybalko # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 28 AC_DEFUN([AX_BOOST_FILESYSTEM], [ AC_ARG_WITH([boost-filesystem], AS_HELP_STRING([--with-boost-filesystem@<:@=special-lib@:>@], [use the Filesystem library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-filesystem=boost_filesystem-gcc-mt ]), [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_filesystem_lib="" else want_boost="yes" ax_boost_user_filesystem_lib="$withval" fi ], [want_boost="yes"] ) if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CC]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS LIBS_SAVED=$LIBS LIBS="$LIBS $BOOST_SYSTEM_LIB" export LIBS AC_CACHE_CHECK(whether the Boost::Filesystem library is available, ax_cv_boost_filesystem, [AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[using namespace boost::filesystem; path my_path( "foo/bar/data.txt" ); return 0;]])], ax_cv_boost_filesystem=yes, ax_cv_boost_filesystem=no) AC_LANG_POP([C++]) ]) if test "x$ax_cv_boost_filesystem" = "xyes"; then AC_DEFINE(HAVE_BOOST_FILESYSTEM,,[define if the Boost::Filesystem library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` if test "x$ax_boost_user_filesystem_lib" = "x"; then for libextension in `ls -r $BOOSTLIBDIR/libboost_filesystem* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], [link_filesystem="no"]) done if test "x$link_filesystem" != "xyes"; then for libextension in `ls -r $BOOSTLIBDIR/boost_filesystem* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], [link_filesystem="no"]) done fi else for ax_lib in $ax_boost_user_filesystem_lib boost_filesystem-$ax_boost_user_filesystem_lib; do AC_CHECK_LIB($ax_lib, exit, [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], [link_filesystem="no"]) done fi if test "x$ax_lib" = "x"; then AC_MSG_ERROR(Could not find a version of the Boost::Filesystem library!) fi if test "x$link_filesystem" != "xyes"; then AC_MSG_ERROR(Could not link against $ax_lib !) fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" LIBS="$LIBS_SAVED" fi ]) gource-0.54/Makefile.in0000644002342600234260000116275614362112040014646 0ustar andrewcandrewc# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 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@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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@ bin_PROGRAMS = gource$(EXEEXT) @USE_BUNDLED_TINYXML_TRUE@am__append_1 = \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/tinyxmlerror.cpp \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/tinystr.cpp \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/tinyxml.cpp \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/tinyxmlparser.cpp @FONTFILE_TRUE@am__append_2 = -DGOURCE_FONT_FILE=\"$(gourcefontfile)\" @FONTDIR_TRUE@@FONTFILE_FALSE@am__append_3 = -DSDLAPP_FONT_DIR=\"$(gourcefontdir)\" check_PROGRAMS = gource_tests$(EXEEXT) TESTS = gource_tests$(EXEEXT) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_boost_base.m4 \ $(top_srcdir)/m4/ax_boost_filesystem.m4 \ $(top_srcdir)/m4/ax_boost_system.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_restore_flags_with_prefix.m4 \ $(top_srcdir)/m4/ax_save_flags_with_prefix.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__dist_fonts_DATA_DIST) \ $(dist_pkgdata_DATA) $(dist_shaders_DATA) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(fontsdir)" \ "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(shadersdir)" PROGRAMS = $(bin_PROGRAMS) am__gource_SOURCES_DIST = src/main.cpp src/action.cpp src/bloom.cpp \ src/caption.cpp src/core/conffile.cpp src/core/display.cpp \ src/core/frustum.cpp src/core/fxfont.cpp src/core/logger.cpp \ src/core/mousecursor.cpp src/core/plane.cpp src/core/ppm.cpp \ src/core/quadtree.cpp src/core/regex.cpp src/core/resource.cpp \ src/core/sdlapp.cpp src/core/seeklog.cpp src/core/settings.cpp \ src/core/shader.cpp src/core/shader_common.cpp \ src/core/stringhash.cpp src/core/texture.cpp \ src/core/png_writer.cpp src/core/timezone.cpp src/core/vbo.cpp \ src/core/vectors.cpp src/dirnode.cpp src/file.cpp \ src/formats/apache.cpp src/formats/bzr.cpp \ src/formats/commitlog.cpp src/formats/custom.cpp \ src/formats/cvs-exp.cpp src/formats/cvs2cl.cpp \ src/formats/git.cpp src/formats/gitraw.cpp src/formats/hg.cpp \ src/formats/svn.cpp src/gource.cpp src/gource_shell.cpp \ src/gource_settings.cpp src/key.cpp src/logmill.cpp \ src/pawn.cpp src/slider.cpp src/spline.cpp src/textbox.cpp \ src/user.cpp src/zoomcamera.cpp src/tinyxml/tinyxmlerror.cpp \ src/tinyxml/tinystr.cpp src/tinyxml/tinyxml.cpp \ src/tinyxml/tinyxmlparser.cpp am__dirstamp = $(am__leading_dot)dirstamp @USE_BUNDLED_TINYXML_TRUE@am__objects_1 = src/tinyxml/gource-tinyxmlerror.$(OBJEXT) \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/gource-tinystr.$(OBJEXT) \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/gource-tinyxml.$(OBJEXT) \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/gource-tinyxmlparser.$(OBJEXT) am__objects_2 = src/gource-action.$(OBJEXT) src/gource-bloom.$(OBJEXT) \ src/gource-caption.$(OBJEXT) \ src/core/gource-conffile.$(OBJEXT) \ src/core/gource-display.$(OBJEXT) \ src/core/gource-frustum.$(OBJEXT) \ src/core/gource-fxfont.$(OBJEXT) \ src/core/gource-logger.$(OBJEXT) \ src/core/gource-mousecursor.$(OBJEXT) \ src/core/gource-plane.$(OBJEXT) src/core/gource-ppm.$(OBJEXT) \ src/core/gource-quadtree.$(OBJEXT) \ src/core/gource-regex.$(OBJEXT) \ src/core/gource-resource.$(OBJEXT) \ src/core/gource-sdlapp.$(OBJEXT) \ src/core/gource-seeklog.$(OBJEXT) \ src/core/gource-settings.$(OBJEXT) \ src/core/gource-shader.$(OBJEXT) \ src/core/gource-shader_common.$(OBJEXT) \ src/core/gource-stringhash.$(OBJEXT) \ src/core/gource-texture.$(OBJEXT) \ src/core/gource-png_writer.$(OBJEXT) \ src/core/gource-timezone.$(OBJEXT) \ src/core/gource-vbo.$(OBJEXT) \ src/core/gource-vectors.$(OBJEXT) src/gource-dirnode.$(OBJEXT) \ src/gource-file.$(OBJEXT) src/formats/gource-apache.$(OBJEXT) \ src/formats/gource-bzr.$(OBJEXT) \ src/formats/gource-commitlog.$(OBJEXT) \ src/formats/gource-custom.$(OBJEXT) \ src/formats/gource-cvs-exp.$(OBJEXT) \ src/formats/gource-cvs2cl.$(OBJEXT) \ src/formats/gource-git.$(OBJEXT) \ src/formats/gource-gitraw.$(OBJEXT) \ src/formats/gource-hg.$(OBJEXT) \ src/formats/gource-svn.$(OBJEXT) src/gource-gource.$(OBJEXT) \ src/gource-gource_shell.$(OBJEXT) \ src/gource-gource_settings.$(OBJEXT) src/gource-key.$(OBJEXT) \ src/gource-logmill.$(OBJEXT) src/gource-pawn.$(OBJEXT) \ src/gource-slider.$(OBJEXT) src/gource-spline.$(OBJEXT) \ src/gource-textbox.$(OBJEXT) src/gource-user.$(OBJEXT) \ src/gource-zoomcamera.$(OBJEXT) $(am__objects_1) am_gource_OBJECTS = src/gource-main.$(OBJEXT) $(am__objects_2) gource_OBJECTS = $(am_gource_OBJECTS) gource_LDADD = $(LDADD) gource_LINK = $(CXXLD) $(gource_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am__gource_tests_SOURCES_DIST = src/test/main.cpp \ src/test/datetime_tests.cpp src/test/regex_tests.cpp \ src/action.cpp src/bloom.cpp src/caption.cpp \ src/core/conffile.cpp src/core/display.cpp \ src/core/frustum.cpp src/core/fxfont.cpp src/core/logger.cpp \ src/core/mousecursor.cpp src/core/plane.cpp src/core/ppm.cpp \ src/core/quadtree.cpp src/core/regex.cpp src/core/resource.cpp \ src/core/sdlapp.cpp src/core/seeklog.cpp src/core/settings.cpp \ src/core/shader.cpp src/core/shader_common.cpp \ src/core/stringhash.cpp src/core/texture.cpp \ src/core/png_writer.cpp src/core/timezone.cpp src/core/vbo.cpp \ src/core/vectors.cpp src/dirnode.cpp src/file.cpp \ src/formats/apache.cpp src/formats/bzr.cpp \ src/formats/commitlog.cpp src/formats/custom.cpp \ src/formats/cvs-exp.cpp src/formats/cvs2cl.cpp \ src/formats/git.cpp src/formats/gitraw.cpp src/formats/hg.cpp \ src/formats/svn.cpp src/gource.cpp src/gource_shell.cpp \ src/gource_settings.cpp src/key.cpp src/logmill.cpp \ src/pawn.cpp src/slider.cpp src/spline.cpp src/textbox.cpp \ src/user.cpp src/zoomcamera.cpp src/tinyxml/tinyxmlerror.cpp \ src/tinyxml/tinystr.cpp src/tinyxml/tinyxml.cpp \ src/tinyxml/tinyxmlparser.cpp @USE_BUNDLED_TINYXML_TRUE@am__objects_3 = src/tinyxml/gource_tests-tinyxmlerror.$(OBJEXT) \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/gource_tests-tinystr.$(OBJEXT) \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/gource_tests-tinyxml.$(OBJEXT) \ @USE_BUNDLED_TINYXML_TRUE@ src/tinyxml/gource_tests-tinyxmlparser.$(OBJEXT) am__objects_4 = src/gource_tests-action.$(OBJEXT) \ src/gource_tests-bloom.$(OBJEXT) \ src/gource_tests-caption.$(OBJEXT) \ src/core/gource_tests-conffile.$(OBJEXT) \ src/core/gource_tests-display.$(OBJEXT) \ src/core/gource_tests-frustum.$(OBJEXT) \ src/core/gource_tests-fxfont.$(OBJEXT) \ src/core/gource_tests-logger.$(OBJEXT) \ src/core/gource_tests-mousecursor.$(OBJEXT) \ src/core/gource_tests-plane.$(OBJEXT) \ src/core/gource_tests-ppm.$(OBJEXT) \ src/core/gource_tests-quadtree.$(OBJEXT) \ src/core/gource_tests-regex.$(OBJEXT) \ src/core/gource_tests-resource.$(OBJEXT) \ src/core/gource_tests-sdlapp.$(OBJEXT) \ src/core/gource_tests-seeklog.$(OBJEXT) \ src/core/gource_tests-settings.$(OBJEXT) \ src/core/gource_tests-shader.$(OBJEXT) \ src/core/gource_tests-shader_common.$(OBJEXT) \ src/core/gource_tests-stringhash.$(OBJEXT) \ src/core/gource_tests-texture.$(OBJEXT) \ src/core/gource_tests-png_writer.$(OBJEXT) \ src/core/gource_tests-timezone.$(OBJEXT) \ src/core/gource_tests-vbo.$(OBJEXT) \ src/core/gource_tests-vectors.$(OBJEXT) \ src/gource_tests-dirnode.$(OBJEXT) \ src/gource_tests-file.$(OBJEXT) \ src/formats/gource_tests-apache.$(OBJEXT) \ src/formats/gource_tests-bzr.$(OBJEXT) \ src/formats/gource_tests-commitlog.$(OBJEXT) \ src/formats/gource_tests-custom.$(OBJEXT) \ src/formats/gource_tests-cvs-exp.$(OBJEXT) \ src/formats/gource_tests-cvs2cl.$(OBJEXT) \ src/formats/gource_tests-git.$(OBJEXT) \ src/formats/gource_tests-gitraw.$(OBJEXT) \ src/formats/gource_tests-hg.$(OBJEXT) \ src/formats/gource_tests-svn.$(OBJEXT) \ src/gource_tests-gource.$(OBJEXT) \ src/gource_tests-gource_shell.$(OBJEXT) \ src/gource_tests-gource_settings.$(OBJEXT) \ src/gource_tests-key.$(OBJEXT) \ src/gource_tests-logmill.$(OBJEXT) \ src/gource_tests-pawn.$(OBJEXT) \ src/gource_tests-slider.$(OBJEXT) \ src/gource_tests-spline.$(OBJEXT) \ src/gource_tests-textbox.$(OBJEXT) \ src/gource_tests-user.$(OBJEXT) \ src/gource_tests-zoomcamera.$(OBJEXT) $(am__objects_3) am_gource_tests_OBJECTS = src/test/gource_tests-main.$(OBJEXT) \ src/test/gource_tests-datetime_tests.$(OBJEXT) \ src/test/gource_tests-regex_tests.$(OBJEXT) $(am__objects_4) gource_tests_OBJECTS = $(am_gource_tests_OBJECTS) gource_tests_DEPENDENCIES = gource_tests_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(gource_tests_LDFLAGS) $(LDFLAGS) -o $@ 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 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = src/$(DEPDIR)/gource-action.Po \ src/$(DEPDIR)/gource-bloom.Po src/$(DEPDIR)/gource-caption.Po \ src/$(DEPDIR)/gource-dirnode.Po src/$(DEPDIR)/gource-file.Po \ src/$(DEPDIR)/gource-gource.Po \ src/$(DEPDIR)/gource-gource_settings.Po \ src/$(DEPDIR)/gource-gource_shell.Po \ src/$(DEPDIR)/gource-key.Po src/$(DEPDIR)/gource-logmill.Po \ src/$(DEPDIR)/gource-main.Po src/$(DEPDIR)/gource-pawn.Po \ src/$(DEPDIR)/gource-slider.Po src/$(DEPDIR)/gource-spline.Po \ src/$(DEPDIR)/gource-textbox.Po src/$(DEPDIR)/gource-user.Po \ src/$(DEPDIR)/gource-zoomcamera.Po \ src/$(DEPDIR)/gource_tests-action.Po \ src/$(DEPDIR)/gource_tests-bloom.Po \ src/$(DEPDIR)/gource_tests-caption.Po \ src/$(DEPDIR)/gource_tests-dirnode.Po \ src/$(DEPDIR)/gource_tests-file.Po \ src/$(DEPDIR)/gource_tests-gource.Po \ src/$(DEPDIR)/gource_tests-gource_settings.Po \ src/$(DEPDIR)/gource_tests-gource_shell.Po \ src/$(DEPDIR)/gource_tests-key.Po \ src/$(DEPDIR)/gource_tests-logmill.Po \ src/$(DEPDIR)/gource_tests-pawn.Po \ src/$(DEPDIR)/gource_tests-slider.Po \ src/$(DEPDIR)/gource_tests-spline.Po \ src/$(DEPDIR)/gource_tests-textbox.Po \ src/$(DEPDIR)/gource_tests-user.Po \ src/$(DEPDIR)/gource_tests-zoomcamera.Po \ src/core/$(DEPDIR)/gource-conffile.Po \ src/core/$(DEPDIR)/gource-display.Po \ src/core/$(DEPDIR)/gource-frustum.Po \ src/core/$(DEPDIR)/gource-fxfont.Po \ src/core/$(DEPDIR)/gource-logger.Po \ src/core/$(DEPDIR)/gource-mousecursor.Po \ src/core/$(DEPDIR)/gource-plane.Po \ src/core/$(DEPDIR)/gource-png_writer.Po \ src/core/$(DEPDIR)/gource-ppm.Po \ src/core/$(DEPDIR)/gource-quadtree.Po \ src/core/$(DEPDIR)/gource-regex.Po \ src/core/$(DEPDIR)/gource-resource.Po \ src/core/$(DEPDIR)/gource-sdlapp.Po \ src/core/$(DEPDIR)/gource-seeklog.Po \ src/core/$(DEPDIR)/gource-settings.Po \ src/core/$(DEPDIR)/gource-shader.Po \ src/core/$(DEPDIR)/gource-shader_common.Po \ src/core/$(DEPDIR)/gource-stringhash.Po \ src/core/$(DEPDIR)/gource-texture.Po \ src/core/$(DEPDIR)/gource-timezone.Po \ src/core/$(DEPDIR)/gource-vbo.Po \ src/core/$(DEPDIR)/gource-vectors.Po \ src/core/$(DEPDIR)/gource_tests-conffile.Po \ src/core/$(DEPDIR)/gource_tests-display.Po \ src/core/$(DEPDIR)/gource_tests-frustum.Po \ src/core/$(DEPDIR)/gource_tests-fxfont.Po \ src/core/$(DEPDIR)/gource_tests-logger.Po \ src/core/$(DEPDIR)/gource_tests-mousecursor.Po \ src/core/$(DEPDIR)/gource_tests-plane.Po \ src/core/$(DEPDIR)/gource_tests-png_writer.Po \ src/core/$(DEPDIR)/gource_tests-ppm.Po \ src/core/$(DEPDIR)/gource_tests-quadtree.Po \ src/core/$(DEPDIR)/gource_tests-regex.Po \ src/core/$(DEPDIR)/gource_tests-resource.Po \ src/core/$(DEPDIR)/gource_tests-sdlapp.Po \ src/core/$(DEPDIR)/gource_tests-seeklog.Po \ src/core/$(DEPDIR)/gource_tests-settings.Po \ src/core/$(DEPDIR)/gource_tests-shader.Po \ src/core/$(DEPDIR)/gource_tests-shader_common.Po \ src/core/$(DEPDIR)/gource_tests-stringhash.Po \ src/core/$(DEPDIR)/gource_tests-texture.Po \ src/core/$(DEPDIR)/gource_tests-timezone.Po \ src/core/$(DEPDIR)/gource_tests-vbo.Po \ src/core/$(DEPDIR)/gource_tests-vectors.Po \ src/formats/$(DEPDIR)/gource-apache.Po \ src/formats/$(DEPDIR)/gource-bzr.Po \ src/formats/$(DEPDIR)/gource-commitlog.Po \ src/formats/$(DEPDIR)/gource-custom.Po \ src/formats/$(DEPDIR)/gource-cvs-exp.Po \ src/formats/$(DEPDIR)/gource-cvs2cl.Po \ src/formats/$(DEPDIR)/gource-git.Po \ src/formats/$(DEPDIR)/gource-gitraw.Po \ src/formats/$(DEPDIR)/gource-hg.Po \ src/formats/$(DEPDIR)/gource-svn.Po \ src/formats/$(DEPDIR)/gource_tests-apache.Po \ src/formats/$(DEPDIR)/gource_tests-bzr.Po \ src/formats/$(DEPDIR)/gource_tests-commitlog.Po \ src/formats/$(DEPDIR)/gource_tests-custom.Po \ src/formats/$(DEPDIR)/gource_tests-cvs-exp.Po \ src/formats/$(DEPDIR)/gource_tests-cvs2cl.Po \ src/formats/$(DEPDIR)/gource_tests-git.Po \ src/formats/$(DEPDIR)/gource_tests-gitraw.Po \ src/formats/$(DEPDIR)/gource_tests-hg.Po \ src/formats/$(DEPDIR)/gource_tests-svn.Po \ src/test/$(DEPDIR)/gource_tests-datetime_tests.Po \ src/test/$(DEPDIR)/gource_tests-main.Po \ src/test/$(DEPDIR)/gource_tests-regex_tests.Po \ src/tinyxml/$(DEPDIR)/gource-tinystr.Po \ src/tinyxml/$(DEPDIR)/gource-tinyxml.Po \ src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Po \ src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Po \ src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Po \ src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Po \ src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Po \ src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(gource_SOURCES) $(gource_tests_SOURCES) DIST_SOURCES = $(am__gource_SOURCES_DIST) \ $(am__gource_tests_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__dist_fonts_DATA_DIST = data/fonts/README data/fonts/FreeSans.ttf 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; }; \ } DATA = $(dist_fonts_DATA) $(dist_pkgdata_DATA) $(dist_shaders_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope check recheck am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/compile \ $(top_srcdir)/build-aux/config.guess \ $(top_srcdir)/build-aux/config.sub \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/install-sh \ $(top_srcdir)/build-aux/missing \ $(top_srcdir)/build-aux/test-driver COPYING ChangeLog INSTALL \ THANKS build-aux/compile build-aux/config.guess \ build-aux/config.sub build-aux/depcomp build-aux/install-sh \ build-aux/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best DIST_TARGETS = dist-bzip2 dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_FILESYSTEM_LIB = @BOOST_FILESYSTEM_LIB@ BOOST_LDFLAGS = @BOOST_LDFLAGS@ BOOST_SYSTEM_LIB = @BOOST_SYSTEM_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FT2_CFLAGS = @FT2_CFLAGS@ FT2_LIBS = @FT2_LIBS@ GLEW_CFLAGS = @GLEW_CFLAGS@ GLEW_LIBS = @GLEW_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PCRE2_CFLAGS = @PCRE2_CFLAGS@ PCRE2_LIBS = @PCRE2_LIBS@ PKG_CONFIG = @PKG_CONFIG@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ SDL2_CFLAGS = @SDL2_CFLAGS@ SDL2_LIBS = @SDL2_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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@ gourcefontdir = @gourcefontdir@ gourcefontfile = @gourcefontfile@ 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@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ 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@ ACLOCAL_AMFLAGS = -I m4 gource_CXXFLAGS = -std=gnu++0x -Wall -Wno-sign-compare -Wno-reorder -Wno-unused-but-set-variable -Wno-unused-variable sources = src/action.cpp src/bloom.cpp src/caption.cpp \ src/core/conffile.cpp src/core/display.cpp \ src/core/frustum.cpp src/core/fxfont.cpp src/core/logger.cpp \ src/core/mousecursor.cpp src/core/plane.cpp src/core/ppm.cpp \ src/core/quadtree.cpp src/core/regex.cpp src/core/resource.cpp \ src/core/sdlapp.cpp src/core/seeklog.cpp src/core/settings.cpp \ src/core/shader.cpp src/core/shader_common.cpp \ src/core/stringhash.cpp src/core/texture.cpp \ src/core/png_writer.cpp src/core/timezone.cpp src/core/vbo.cpp \ src/core/vectors.cpp src/dirnode.cpp src/file.cpp \ src/formats/apache.cpp src/formats/bzr.cpp \ src/formats/commitlog.cpp src/formats/custom.cpp \ src/formats/cvs-exp.cpp src/formats/cvs2cl.cpp \ src/formats/git.cpp src/formats/gitraw.cpp src/formats/hg.cpp \ src/formats/svn.cpp src/gource.cpp src/gource_shell.cpp \ src/gource_settings.cpp src/key.cpp src/logmill.cpp \ src/pawn.cpp src/slider.cpp src/spline.cpp src/textbox.cpp \ src/user.cpp src/zoomcamera.cpp $(am__append_1) gource_SOURCES = src/main.cpp ${sources} AM_CPPFLAGS = -DSDLAPP_RESOURCE_DIR=\"$(pkgdatadir)\" $(am__append_2) \ $(am__append_3) dist_pkgdata_DATA = data/beam.png data/bloom.tga data/bloom_alpha.tga data/file.png data/user.png data/gource.style shadersdir = $(pkgdatadir)/shaders dist_shaders_DATA = data/shaders/shadow.vert data/shaders/shadow.frag data/shaders/bloom.vert data/shaders/bloom.frag data/shaders/text.vert data/shaders/text.frag @FONTDIR_FALSE@@FONTFILE_FALSE@fontsdir = $(pkgdatadir)/fonts @FONTDIR_FALSE@@FONTFILE_FALSE@dist_fonts_DATA = data/fonts/README data/fonts/FreeSans.ttf gource_tests_CPPFLAGS = -I src/test/ ${BOOST_CPPFLAGS} gource_tests_LDFLAGS = ${BOOST_LDFLAGS} gource_tests_LDADD = ${BOOST_UNIT_TEST_FRAMEWORK_LIB} gource_tests_SOURCES = \ src/test/main.cpp \ src/test/datetime_tests.cpp \ src/test/regex_tests.cpp \ ${sources} all: all-am .SUFFIXES: .SUFFIXES: .cpp .log .o .obj .test .test$(EXEEXT) .trs am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) clean-checkPROGRAMS: -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/gource-main.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-action.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-bloom.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-caption.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/core/$(am__dirstamp): @$(MKDIR_P) src/core @: > src/core/$(am__dirstamp) src/core/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/core/$(DEPDIR) @: > src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-conffile.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-display.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-frustum.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-fxfont.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-logger.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-mousecursor.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-plane.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-ppm.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-quadtree.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-regex.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-resource.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-sdlapp.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-seeklog.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-settings.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-shader.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-shader_common.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-stringhash.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-texture.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-png_writer.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-timezone.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-vbo.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource-vectors.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/gource-dirnode.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-file.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/formats/$(am__dirstamp): @$(MKDIR_P) src/formats @: > src/formats/$(am__dirstamp) src/formats/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/formats/$(DEPDIR) @: > src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-apache.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-bzr.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-commitlog.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-custom.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-cvs-exp.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-cvs2cl.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-git.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-gitraw.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-hg.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource-svn.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/gource-gource.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-gource_shell.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-gource_settings.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-key.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-logmill.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-pawn.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-slider.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-spline.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-textbox.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-user.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource-zoomcamera.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/tinyxml/$(am__dirstamp): @$(MKDIR_P) src/tinyxml @: > src/tinyxml/$(am__dirstamp) src/tinyxml/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/tinyxml/$(DEPDIR) @: > src/tinyxml/$(DEPDIR)/$(am__dirstamp) src/tinyxml/gource-tinyxmlerror.$(OBJEXT): \ src/tinyxml/$(am__dirstamp) \ src/tinyxml/$(DEPDIR)/$(am__dirstamp) src/tinyxml/gource-tinystr.$(OBJEXT): src/tinyxml/$(am__dirstamp) \ src/tinyxml/$(DEPDIR)/$(am__dirstamp) src/tinyxml/gource-tinyxml.$(OBJEXT): src/tinyxml/$(am__dirstamp) \ src/tinyxml/$(DEPDIR)/$(am__dirstamp) src/tinyxml/gource-tinyxmlparser.$(OBJEXT): \ src/tinyxml/$(am__dirstamp) \ src/tinyxml/$(DEPDIR)/$(am__dirstamp) gource$(EXEEXT): $(gource_OBJECTS) $(gource_DEPENDENCIES) $(EXTRA_gource_DEPENDENCIES) @rm -f gource$(EXEEXT) $(AM_V_CXXLD)$(gource_LINK) $(gource_OBJECTS) $(gource_LDADD) $(LIBS) src/test/$(am__dirstamp): @$(MKDIR_P) src/test @: > src/test/$(am__dirstamp) src/test/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/test/$(DEPDIR) @: > src/test/$(DEPDIR)/$(am__dirstamp) src/test/gource_tests-main.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/gource_tests-datetime_tests.$(OBJEXT): \ src/test/$(am__dirstamp) src/test/$(DEPDIR)/$(am__dirstamp) src/test/gource_tests-regex_tests.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/gource_tests-action.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-bloom.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-caption.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-conffile.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-display.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-frustum.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-fxfont.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-logger.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-mousecursor.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-plane.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-ppm.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-quadtree.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-regex.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-resource.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-sdlapp.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-seeklog.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-settings.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-shader.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-shader_common.$(OBJEXT): \ src/core/$(am__dirstamp) src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-stringhash.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-texture.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-png_writer.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-timezone.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-vbo.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/core/gource_tests-vectors.$(OBJEXT): src/core/$(am__dirstamp) \ src/core/$(DEPDIR)/$(am__dirstamp) src/gource_tests-dirnode.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-file.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-apache.$(OBJEXT): \ src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-bzr.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-commitlog.$(OBJEXT): \ src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-custom.$(OBJEXT): \ src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-cvs-exp.$(OBJEXT): \ src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-cvs2cl.$(OBJEXT): \ src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-git.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-gitraw.$(OBJEXT): \ src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-hg.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/formats/gource_tests-svn.$(OBJEXT): src/formats/$(am__dirstamp) \ src/formats/$(DEPDIR)/$(am__dirstamp) src/gource_tests-gource.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-gource_shell.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-gource_settings.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-key.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-logmill.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-pawn.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-slider.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-spline.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-textbox.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-user.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/gource_tests-zoomcamera.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/tinyxml/gource_tests-tinyxmlerror.$(OBJEXT): \ src/tinyxml/$(am__dirstamp) \ src/tinyxml/$(DEPDIR)/$(am__dirstamp) src/tinyxml/gource_tests-tinystr.$(OBJEXT): \ src/tinyxml/$(am__dirstamp) \ src/tinyxml/$(DEPDIR)/$(am__dirstamp) src/tinyxml/gource_tests-tinyxml.$(OBJEXT): \ src/tinyxml/$(am__dirstamp) \ src/tinyxml/$(DEPDIR)/$(am__dirstamp) src/tinyxml/gource_tests-tinyxmlparser.$(OBJEXT): \ src/tinyxml/$(am__dirstamp) \ src/tinyxml/$(DEPDIR)/$(am__dirstamp) gource_tests$(EXEEXT): $(gource_tests_OBJECTS) $(gource_tests_DEPENDENCIES) $(EXTRA_gource_tests_DEPENDENCIES) @rm -f gource_tests$(EXEEXT) $(AM_V_CXXLD)$(gource_tests_LINK) $(gource_tests_OBJECTS) $(gource_tests_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/*.$(OBJEXT) -rm -f src/core/*.$(OBJEXT) -rm -f src/formats/*.$(OBJEXT) -rm -f src/test/*.$(OBJEXT) -rm -f src/tinyxml/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-action.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-bloom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-caption.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-dirnode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-gource.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-gource_settings.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-gource_shell.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-key.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-logmill.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-pawn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-slider.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-spline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-textbox.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-user.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource-zoomcamera.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-action.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-bloom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-caption.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-dirnode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-gource.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-gource_settings.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-gource_shell.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-key.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-logmill.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-pawn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-slider.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-spline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-textbox.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-user.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gource_tests-zoomcamera.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-conffile.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-display.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-frustum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-fxfont.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-logger.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-mousecursor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-plane.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-png_writer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-ppm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-quadtree.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-regex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-resource.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-sdlapp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-seeklog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-settings.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-shader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-shader_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-stringhash.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-texture.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-timezone.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-vbo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource-vectors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-conffile.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-display.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-frustum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-fxfont.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-logger.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-mousecursor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-plane.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-png_writer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-ppm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-quadtree.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-regex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-resource.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-sdlapp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-seeklog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-settings.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-shader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-shader_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-stringhash.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-texture.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-timezone.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-vbo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/core/$(DEPDIR)/gource_tests-vectors.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-apache.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-bzr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-commitlog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-custom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-cvs-exp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-cvs2cl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-git.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-gitraw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-hg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource-svn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-apache.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-bzr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-commitlog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-custom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-cvs-exp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-cvs2cl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-git.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-gitraw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-hg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/formats/$(DEPDIR)/gource_tests-svn.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/gource_tests-datetime_tests.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/gource_tests-main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/gource_tests-regex_tests.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/tinyxml/$(DEPDIR)/gource-tinystr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/tinyxml/$(DEPDIR)/gource-tinyxml.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` src/gource-main.o: src/main.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-main.o -MD -MP -MF src/$(DEPDIR)/gource-main.Tpo -c -o src/gource-main.o `test -f 'src/main.cpp' || echo '$(srcdir)/'`src/main.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-main.Tpo src/$(DEPDIR)/gource-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/main.cpp' object='src/gource-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-main.o `test -f 'src/main.cpp' || echo '$(srcdir)/'`src/main.cpp src/gource-main.obj: src/main.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-main.obj -MD -MP -MF src/$(DEPDIR)/gource-main.Tpo -c -o src/gource-main.obj `if test -f 'src/main.cpp'; then $(CYGPATH_W) 'src/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/main.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-main.Tpo src/$(DEPDIR)/gource-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/main.cpp' object='src/gource-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-main.obj `if test -f 'src/main.cpp'; then $(CYGPATH_W) 'src/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/main.cpp'; fi` src/gource-action.o: src/action.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-action.o -MD -MP -MF src/$(DEPDIR)/gource-action.Tpo -c -o src/gource-action.o `test -f 'src/action.cpp' || echo '$(srcdir)/'`src/action.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-action.Tpo src/$(DEPDIR)/gource-action.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/action.cpp' object='src/gource-action.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-action.o `test -f 'src/action.cpp' || echo '$(srcdir)/'`src/action.cpp src/gource-action.obj: src/action.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-action.obj -MD -MP -MF src/$(DEPDIR)/gource-action.Tpo -c -o src/gource-action.obj `if test -f 'src/action.cpp'; then $(CYGPATH_W) 'src/action.cpp'; else $(CYGPATH_W) '$(srcdir)/src/action.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-action.Tpo src/$(DEPDIR)/gource-action.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/action.cpp' object='src/gource-action.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-action.obj `if test -f 'src/action.cpp'; then $(CYGPATH_W) 'src/action.cpp'; else $(CYGPATH_W) '$(srcdir)/src/action.cpp'; fi` src/gource-bloom.o: src/bloom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-bloom.o -MD -MP -MF src/$(DEPDIR)/gource-bloom.Tpo -c -o src/gource-bloom.o `test -f 'src/bloom.cpp' || echo '$(srcdir)/'`src/bloom.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-bloom.Tpo src/$(DEPDIR)/gource-bloom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/bloom.cpp' object='src/gource-bloom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-bloom.o `test -f 'src/bloom.cpp' || echo '$(srcdir)/'`src/bloom.cpp src/gource-bloom.obj: src/bloom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-bloom.obj -MD -MP -MF src/$(DEPDIR)/gource-bloom.Tpo -c -o src/gource-bloom.obj `if test -f 'src/bloom.cpp'; then $(CYGPATH_W) 'src/bloom.cpp'; else $(CYGPATH_W) '$(srcdir)/src/bloom.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-bloom.Tpo src/$(DEPDIR)/gource-bloom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/bloom.cpp' object='src/gource-bloom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-bloom.obj `if test -f 'src/bloom.cpp'; then $(CYGPATH_W) 'src/bloom.cpp'; else $(CYGPATH_W) '$(srcdir)/src/bloom.cpp'; fi` src/gource-caption.o: src/caption.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-caption.o -MD -MP -MF src/$(DEPDIR)/gource-caption.Tpo -c -o src/gource-caption.o `test -f 'src/caption.cpp' || echo '$(srcdir)/'`src/caption.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-caption.Tpo src/$(DEPDIR)/gource-caption.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/caption.cpp' object='src/gource-caption.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-caption.o `test -f 'src/caption.cpp' || echo '$(srcdir)/'`src/caption.cpp src/gource-caption.obj: src/caption.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-caption.obj -MD -MP -MF src/$(DEPDIR)/gource-caption.Tpo -c -o src/gource-caption.obj `if test -f 'src/caption.cpp'; then $(CYGPATH_W) 'src/caption.cpp'; else $(CYGPATH_W) '$(srcdir)/src/caption.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-caption.Tpo src/$(DEPDIR)/gource-caption.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/caption.cpp' object='src/gource-caption.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-caption.obj `if test -f 'src/caption.cpp'; then $(CYGPATH_W) 'src/caption.cpp'; else $(CYGPATH_W) '$(srcdir)/src/caption.cpp'; fi` src/core/gource-conffile.o: src/core/conffile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-conffile.o -MD -MP -MF src/core/$(DEPDIR)/gource-conffile.Tpo -c -o src/core/gource-conffile.o `test -f 'src/core/conffile.cpp' || echo '$(srcdir)/'`src/core/conffile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-conffile.Tpo src/core/$(DEPDIR)/gource-conffile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/conffile.cpp' object='src/core/gource-conffile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-conffile.o `test -f 'src/core/conffile.cpp' || echo '$(srcdir)/'`src/core/conffile.cpp src/core/gource-conffile.obj: src/core/conffile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-conffile.obj -MD -MP -MF src/core/$(DEPDIR)/gource-conffile.Tpo -c -o src/core/gource-conffile.obj `if test -f 'src/core/conffile.cpp'; then $(CYGPATH_W) 'src/core/conffile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/conffile.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-conffile.Tpo src/core/$(DEPDIR)/gource-conffile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/conffile.cpp' object='src/core/gource-conffile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-conffile.obj `if test -f 'src/core/conffile.cpp'; then $(CYGPATH_W) 'src/core/conffile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/conffile.cpp'; fi` src/core/gource-display.o: src/core/display.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-display.o -MD -MP -MF src/core/$(DEPDIR)/gource-display.Tpo -c -o src/core/gource-display.o `test -f 'src/core/display.cpp' || echo '$(srcdir)/'`src/core/display.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-display.Tpo src/core/$(DEPDIR)/gource-display.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/display.cpp' object='src/core/gource-display.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-display.o `test -f 'src/core/display.cpp' || echo '$(srcdir)/'`src/core/display.cpp src/core/gource-display.obj: src/core/display.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-display.obj -MD -MP -MF src/core/$(DEPDIR)/gource-display.Tpo -c -o src/core/gource-display.obj `if test -f 'src/core/display.cpp'; then $(CYGPATH_W) 'src/core/display.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/display.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-display.Tpo src/core/$(DEPDIR)/gource-display.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/display.cpp' object='src/core/gource-display.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-display.obj `if test -f 'src/core/display.cpp'; then $(CYGPATH_W) 'src/core/display.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/display.cpp'; fi` src/core/gource-frustum.o: src/core/frustum.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-frustum.o -MD -MP -MF src/core/$(DEPDIR)/gource-frustum.Tpo -c -o src/core/gource-frustum.o `test -f 'src/core/frustum.cpp' || echo '$(srcdir)/'`src/core/frustum.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-frustum.Tpo src/core/$(DEPDIR)/gource-frustum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/frustum.cpp' object='src/core/gource-frustum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-frustum.o `test -f 'src/core/frustum.cpp' || echo '$(srcdir)/'`src/core/frustum.cpp src/core/gource-frustum.obj: src/core/frustum.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-frustum.obj -MD -MP -MF src/core/$(DEPDIR)/gource-frustum.Tpo -c -o src/core/gource-frustum.obj `if test -f 'src/core/frustum.cpp'; then $(CYGPATH_W) 'src/core/frustum.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/frustum.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-frustum.Tpo src/core/$(DEPDIR)/gource-frustum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/frustum.cpp' object='src/core/gource-frustum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-frustum.obj `if test -f 'src/core/frustum.cpp'; then $(CYGPATH_W) 'src/core/frustum.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/frustum.cpp'; fi` src/core/gource-fxfont.o: src/core/fxfont.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-fxfont.o -MD -MP -MF src/core/$(DEPDIR)/gource-fxfont.Tpo -c -o src/core/gource-fxfont.o `test -f 'src/core/fxfont.cpp' || echo '$(srcdir)/'`src/core/fxfont.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-fxfont.Tpo src/core/$(DEPDIR)/gource-fxfont.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/fxfont.cpp' object='src/core/gource-fxfont.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-fxfont.o `test -f 'src/core/fxfont.cpp' || echo '$(srcdir)/'`src/core/fxfont.cpp src/core/gource-fxfont.obj: src/core/fxfont.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-fxfont.obj -MD -MP -MF src/core/$(DEPDIR)/gource-fxfont.Tpo -c -o src/core/gource-fxfont.obj `if test -f 'src/core/fxfont.cpp'; then $(CYGPATH_W) 'src/core/fxfont.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/fxfont.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-fxfont.Tpo src/core/$(DEPDIR)/gource-fxfont.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/fxfont.cpp' object='src/core/gource-fxfont.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-fxfont.obj `if test -f 'src/core/fxfont.cpp'; then $(CYGPATH_W) 'src/core/fxfont.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/fxfont.cpp'; fi` src/core/gource-logger.o: src/core/logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-logger.o -MD -MP -MF src/core/$(DEPDIR)/gource-logger.Tpo -c -o src/core/gource-logger.o `test -f 'src/core/logger.cpp' || echo '$(srcdir)/'`src/core/logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-logger.Tpo src/core/$(DEPDIR)/gource-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/logger.cpp' object='src/core/gource-logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-logger.o `test -f 'src/core/logger.cpp' || echo '$(srcdir)/'`src/core/logger.cpp src/core/gource-logger.obj: src/core/logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-logger.obj -MD -MP -MF src/core/$(DEPDIR)/gource-logger.Tpo -c -o src/core/gource-logger.obj `if test -f 'src/core/logger.cpp'; then $(CYGPATH_W) 'src/core/logger.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/logger.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-logger.Tpo src/core/$(DEPDIR)/gource-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/logger.cpp' object='src/core/gource-logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-logger.obj `if test -f 'src/core/logger.cpp'; then $(CYGPATH_W) 'src/core/logger.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/logger.cpp'; fi` src/core/gource-mousecursor.o: src/core/mousecursor.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-mousecursor.o -MD -MP -MF src/core/$(DEPDIR)/gource-mousecursor.Tpo -c -o src/core/gource-mousecursor.o `test -f 'src/core/mousecursor.cpp' || echo '$(srcdir)/'`src/core/mousecursor.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-mousecursor.Tpo src/core/$(DEPDIR)/gource-mousecursor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/mousecursor.cpp' object='src/core/gource-mousecursor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-mousecursor.o `test -f 'src/core/mousecursor.cpp' || echo '$(srcdir)/'`src/core/mousecursor.cpp src/core/gource-mousecursor.obj: src/core/mousecursor.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-mousecursor.obj -MD -MP -MF src/core/$(DEPDIR)/gource-mousecursor.Tpo -c -o src/core/gource-mousecursor.obj `if test -f 'src/core/mousecursor.cpp'; then $(CYGPATH_W) 'src/core/mousecursor.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/mousecursor.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-mousecursor.Tpo src/core/$(DEPDIR)/gource-mousecursor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/mousecursor.cpp' object='src/core/gource-mousecursor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-mousecursor.obj `if test -f 'src/core/mousecursor.cpp'; then $(CYGPATH_W) 'src/core/mousecursor.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/mousecursor.cpp'; fi` src/core/gource-plane.o: src/core/plane.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-plane.o -MD -MP -MF src/core/$(DEPDIR)/gource-plane.Tpo -c -o src/core/gource-plane.o `test -f 'src/core/plane.cpp' || echo '$(srcdir)/'`src/core/plane.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-plane.Tpo src/core/$(DEPDIR)/gource-plane.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/plane.cpp' object='src/core/gource-plane.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-plane.o `test -f 'src/core/plane.cpp' || echo '$(srcdir)/'`src/core/plane.cpp src/core/gource-plane.obj: src/core/plane.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-plane.obj -MD -MP -MF src/core/$(DEPDIR)/gource-plane.Tpo -c -o src/core/gource-plane.obj `if test -f 'src/core/plane.cpp'; then $(CYGPATH_W) 'src/core/plane.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/plane.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-plane.Tpo src/core/$(DEPDIR)/gource-plane.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/plane.cpp' object='src/core/gource-plane.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-plane.obj `if test -f 'src/core/plane.cpp'; then $(CYGPATH_W) 'src/core/plane.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/plane.cpp'; fi` src/core/gource-ppm.o: src/core/ppm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-ppm.o -MD -MP -MF src/core/$(DEPDIR)/gource-ppm.Tpo -c -o src/core/gource-ppm.o `test -f 'src/core/ppm.cpp' || echo '$(srcdir)/'`src/core/ppm.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-ppm.Tpo src/core/$(DEPDIR)/gource-ppm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/ppm.cpp' object='src/core/gource-ppm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-ppm.o `test -f 'src/core/ppm.cpp' || echo '$(srcdir)/'`src/core/ppm.cpp src/core/gource-ppm.obj: src/core/ppm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-ppm.obj -MD -MP -MF src/core/$(DEPDIR)/gource-ppm.Tpo -c -o src/core/gource-ppm.obj `if test -f 'src/core/ppm.cpp'; then $(CYGPATH_W) 'src/core/ppm.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/ppm.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-ppm.Tpo src/core/$(DEPDIR)/gource-ppm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/ppm.cpp' object='src/core/gource-ppm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-ppm.obj `if test -f 'src/core/ppm.cpp'; then $(CYGPATH_W) 'src/core/ppm.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/ppm.cpp'; fi` src/core/gource-quadtree.o: src/core/quadtree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-quadtree.o -MD -MP -MF src/core/$(DEPDIR)/gource-quadtree.Tpo -c -o src/core/gource-quadtree.o `test -f 'src/core/quadtree.cpp' || echo '$(srcdir)/'`src/core/quadtree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-quadtree.Tpo src/core/$(DEPDIR)/gource-quadtree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/quadtree.cpp' object='src/core/gource-quadtree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-quadtree.o `test -f 'src/core/quadtree.cpp' || echo '$(srcdir)/'`src/core/quadtree.cpp src/core/gource-quadtree.obj: src/core/quadtree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-quadtree.obj -MD -MP -MF src/core/$(DEPDIR)/gource-quadtree.Tpo -c -o src/core/gource-quadtree.obj `if test -f 'src/core/quadtree.cpp'; then $(CYGPATH_W) 'src/core/quadtree.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/quadtree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-quadtree.Tpo src/core/$(DEPDIR)/gource-quadtree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/quadtree.cpp' object='src/core/gource-quadtree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-quadtree.obj `if test -f 'src/core/quadtree.cpp'; then $(CYGPATH_W) 'src/core/quadtree.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/quadtree.cpp'; fi` src/core/gource-regex.o: src/core/regex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-regex.o -MD -MP -MF src/core/$(DEPDIR)/gource-regex.Tpo -c -o src/core/gource-regex.o `test -f 'src/core/regex.cpp' || echo '$(srcdir)/'`src/core/regex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-regex.Tpo src/core/$(DEPDIR)/gource-regex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/regex.cpp' object='src/core/gource-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-regex.o `test -f 'src/core/regex.cpp' || echo '$(srcdir)/'`src/core/regex.cpp src/core/gource-regex.obj: src/core/regex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-regex.obj -MD -MP -MF src/core/$(DEPDIR)/gource-regex.Tpo -c -o src/core/gource-regex.obj `if test -f 'src/core/regex.cpp'; then $(CYGPATH_W) 'src/core/regex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/regex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-regex.Tpo src/core/$(DEPDIR)/gource-regex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/regex.cpp' object='src/core/gource-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-regex.obj `if test -f 'src/core/regex.cpp'; then $(CYGPATH_W) 'src/core/regex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/regex.cpp'; fi` src/core/gource-resource.o: src/core/resource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-resource.o -MD -MP -MF src/core/$(DEPDIR)/gource-resource.Tpo -c -o src/core/gource-resource.o `test -f 'src/core/resource.cpp' || echo '$(srcdir)/'`src/core/resource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-resource.Tpo src/core/$(DEPDIR)/gource-resource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/resource.cpp' object='src/core/gource-resource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-resource.o `test -f 'src/core/resource.cpp' || echo '$(srcdir)/'`src/core/resource.cpp src/core/gource-resource.obj: src/core/resource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-resource.obj -MD -MP -MF src/core/$(DEPDIR)/gource-resource.Tpo -c -o src/core/gource-resource.obj `if test -f 'src/core/resource.cpp'; then $(CYGPATH_W) 'src/core/resource.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/resource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-resource.Tpo src/core/$(DEPDIR)/gource-resource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/resource.cpp' object='src/core/gource-resource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-resource.obj `if test -f 'src/core/resource.cpp'; then $(CYGPATH_W) 'src/core/resource.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/resource.cpp'; fi` src/core/gource-sdlapp.o: src/core/sdlapp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-sdlapp.o -MD -MP -MF src/core/$(DEPDIR)/gource-sdlapp.Tpo -c -o src/core/gource-sdlapp.o `test -f 'src/core/sdlapp.cpp' || echo '$(srcdir)/'`src/core/sdlapp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-sdlapp.Tpo src/core/$(DEPDIR)/gource-sdlapp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/sdlapp.cpp' object='src/core/gource-sdlapp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-sdlapp.o `test -f 'src/core/sdlapp.cpp' || echo '$(srcdir)/'`src/core/sdlapp.cpp src/core/gource-sdlapp.obj: src/core/sdlapp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-sdlapp.obj -MD -MP -MF src/core/$(DEPDIR)/gource-sdlapp.Tpo -c -o src/core/gource-sdlapp.obj `if test -f 'src/core/sdlapp.cpp'; then $(CYGPATH_W) 'src/core/sdlapp.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/sdlapp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-sdlapp.Tpo src/core/$(DEPDIR)/gource-sdlapp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/sdlapp.cpp' object='src/core/gource-sdlapp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-sdlapp.obj `if test -f 'src/core/sdlapp.cpp'; then $(CYGPATH_W) 'src/core/sdlapp.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/sdlapp.cpp'; fi` src/core/gource-seeklog.o: src/core/seeklog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-seeklog.o -MD -MP -MF src/core/$(DEPDIR)/gource-seeklog.Tpo -c -o src/core/gource-seeklog.o `test -f 'src/core/seeklog.cpp' || echo '$(srcdir)/'`src/core/seeklog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-seeklog.Tpo src/core/$(DEPDIR)/gource-seeklog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/seeklog.cpp' object='src/core/gource-seeklog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-seeklog.o `test -f 'src/core/seeklog.cpp' || echo '$(srcdir)/'`src/core/seeklog.cpp src/core/gource-seeklog.obj: src/core/seeklog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-seeklog.obj -MD -MP -MF src/core/$(DEPDIR)/gource-seeklog.Tpo -c -o src/core/gource-seeklog.obj `if test -f 'src/core/seeklog.cpp'; then $(CYGPATH_W) 'src/core/seeklog.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/seeklog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-seeklog.Tpo src/core/$(DEPDIR)/gource-seeklog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/seeklog.cpp' object='src/core/gource-seeklog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-seeklog.obj `if test -f 'src/core/seeklog.cpp'; then $(CYGPATH_W) 'src/core/seeklog.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/seeklog.cpp'; fi` src/core/gource-settings.o: src/core/settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-settings.o -MD -MP -MF src/core/$(DEPDIR)/gource-settings.Tpo -c -o src/core/gource-settings.o `test -f 'src/core/settings.cpp' || echo '$(srcdir)/'`src/core/settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-settings.Tpo src/core/$(DEPDIR)/gource-settings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/settings.cpp' object='src/core/gource-settings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-settings.o `test -f 'src/core/settings.cpp' || echo '$(srcdir)/'`src/core/settings.cpp src/core/gource-settings.obj: src/core/settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-settings.obj -MD -MP -MF src/core/$(DEPDIR)/gource-settings.Tpo -c -o src/core/gource-settings.obj `if test -f 'src/core/settings.cpp'; then $(CYGPATH_W) 'src/core/settings.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/settings.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-settings.Tpo src/core/$(DEPDIR)/gource-settings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/settings.cpp' object='src/core/gource-settings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-settings.obj `if test -f 'src/core/settings.cpp'; then $(CYGPATH_W) 'src/core/settings.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/settings.cpp'; fi` src/core/gource-shader.o: src/core/shader.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-shader.o -MD -MP -MF src/core/$(DEPDIR)/gource-shader.Tpo -c -o src/core/gource-shader.o `test -f 'src/core/shader.cpp' || echo '$(srcdir)/'`src/core/shader.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-shader.Tpo src/core/$(DEPDIR)/gource-shader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/shader.cpp' object='src/core/gource-shader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-shader.o `test -f 'src/core/shader.cpp' || echo '$(srcdir)/'`src/core/shader.cpp src/core/gource-shader.obj: src/core/shader.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-shader.obj -MD -MP -MF src/core/$(DEPDIR)/gource-shader.Tpo -c -o src/core/gource-shader.obj `if test -f 'src/core/shader.cpp'; then $(CYGPATH_W) 'src/core/shader.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/shader.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-shader.Tpo src/core/$(DEPDIR)/gource-shader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/shader.cpp' object='src/core/gource-shader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-shader.obj `if test -f 'src/core/shader.cpp'; then $(CYGPATH_W) 'src/core/shader.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/shader.cpp'; fi` src/core/gource-shader_common.o: src/core/shader_common.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-shader_common.o -MD -MP -MF src/core/$(DEPDIR)/gource-shader_common.Tpo -c -o src/core/gource-shader_common.o `test -f 'src/core/shader_common.cpp' || echo '$(srcdir)/'`src/core/shader_common.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-shader_common.Tpo src/core/$(DEPDIR)/gource-shader_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/shader_common.cpp' object='src/core/gource-shader_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-shader_common.o `test -f 'src/core/shader_common.cpp' || echo '$(srcdir)/'`src/core/shader_common.cpp src/core/gource-shader_common.obj: src/core/shader_common.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-shader_common.obj -MD -MP -MF src/core/$(DEPDIR)/gource-shader_common.Tpo -c -o src/core/gource-shader_common.obj `if test -f 'src/core/shader_common.cpp'; then $(CYGPATH_W) 'src/core/shader_common.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/shader_common.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-shader_common.Tpo src/core/$(DEPDIR)/gource-shader_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/shader_common.cpp' object='src/core/gource-shader_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-shader_common.obj `if test -f 'src/core/shader_common.cpp'; then $(CYGPATH_W) 'src/core/shader_common.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/shader_common.cpp'; fi` src/core/gource-stringhash.o: src/core/stringhash.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-stringhash.o -MD -MP -MF src/core/$(DEPDIR)/gource-stringhash.Tpo -c -o src/core/gource-stringhash.o `test -f 'src/core/stringhash.cpp' || echo '$(srcdir)/'`src/core/stringhash.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-stringhash.Tpo src/core/$(DEPDIR)/gource-stringhash.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/stringhash.cpp' object='src/core/gource-stringhash.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-stringhash.o `test -f 'src/core/stringhash.cpp' || echo '$(srcdir)/'`src/core/stringhash.cpp src/core/gource-stringhash.obj: src/core/stringhash.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-stringhash.obj -MD -MP -MF src/core/$(DEPDIR)/gource-stringhash.Tpo -c -o src/core/gource-stringhash.obj `if test -f 'src/core/stringhash.cpp'; then $(CYGPATH_W) 'src/core/stringhash.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/stringhash.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-stringhash.Tpo src/core/$(DEPDIR)/gource-stringhash.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/stringhash.cpp' object='src/core/gource-stringhash.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-stringhash.obj `if test -f 'src/core/stringhash.cpp'; then $(CYGPATH_W) 'src/core/stringhash.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/stringhash.cpp'; fi` src/core/gource-texture.o: src/core/texture.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-texture.o -MD -MP -MF src/core/$(DEPDIR)/gource-texture.Tpo -c -o src/core/gource-texture.o `test -f 'src/core/texture.cpp' || echo '$(srcdir)/'`src/core/texture.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-texture.Tpo src/core/$(DEPDIR)/gource-texture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/texture.cpp' object='src/core/gource-texture.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-texture.o `test -f 'src/core/texture.cpp' || echo '$(srcdir)/'`src/core/texture.cpp src/core/gource-texture.obj: src/core/texture.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-texture.obj -MD -MP -MF src/core/$(DEPDIR)/gource-texture.Tpo -c -o src/core/gource-texture.obj `if test -f 'src/core/texture.cpp'; then $(CYGPATH_W) 'src/core/texture.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/texture.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-texture.Tpo src/core/$(DEPDIR)/gource-texture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/texture.cpp' object='src/core/gource-texture.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-texture.obj `if test -f 'src/core/texture.cpp'; then $(CYGPATH_W) 'src/core/texture.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/texture.cpp'; fi` src/core/gource-png_writer.o: src/core/png_writer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-png_writer.o -MD -MP -MF src/core/$(DEPDIR)/gource-png_writer.Tpo -c -o src/core/gource-png_writer.o `test -f 'src/core/png_writer.cpp' || echo '$(srcdir)/'`src/core/png_writer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-png_writer.Tpo src/core/$(DEPDIR)/gource-png_writer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/png_writer.cpp' object='src/core/gource-png_writer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-png_writer.o `test -f 'src/core/png_writer.cpp' || echo '$(srcdir)/'`src/core/png_writer.cpp src/core/gource-png_writer.obj: src/core/png_writer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-png_writer.obj -MD -MP -MF src/core/$(DEPDIR)/gource-png_writer.Tpo -c -o src/core/gource-png_writer.obj `if test -f 'src/core/png_writer.cpp'; then $(CYGPATH_W) 'src/core/png_writer.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/png_writer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-png_writer.Tpo src/core/$(DEPDIR)/gource-png_writer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/png_writer.cpp' object='src/core/gource-png_writer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-png_writer.obj `if test -f 'src/core/png_writer.cpp'; then $(CYGPATH_W) 'src/core/png_writer.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/png_writer.cpp'; fi` src/core/gource-timezone.o: src/core/timezone.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-timezone.o -MD -MP -MF src/core/$(DEPDIR)/gource-timezone.Tpo -c -o src/core/gource-timezone.o `test -f 'src/core/timezone.cpp' || echo '$(srcdir)/'`src/core/timezone.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-timezone.Tpo src/core/$(DEPDIR)/gource-timezone.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/timezone.cpp' object='src/core/gource-timezone.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-timezone.o `test -f 'src/core/timezone.cpp' || echo '$(srcdir)/'`src/core/timezone.cpp src/core/gource-timezone.obj: src/core/timezone.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-timezone.obj -MD -MP -MF src/core/$(DEPDIR)/gource-timezone.Tpo -c -o src/core/gource-timezone.obj `if test -f 'src/core/timezone.cpp'; then $(CYGPATH_W) 'src/core/timezone.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/timezone.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-timezone.Tpo src/core/$(DEPDIR)/gource-timezone.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/timezone.cpp' object='src/core/gource-timezone.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-timezone.obj `if test -f 'src/core/timezone.cpp'; then $(CYGPATH_W) 'src/core/timezone.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/timezone.cpp'; fi` src/core/gource-vbo.o: src/core/vbo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-vbo.o -MD -MP -MF src/core/$(DEPDIR)/gource-vbo.Tpo -c -o src/core/gource-vbo.o `test -f 'src/core/vbo.cpp' || echo '$(srcdir)/'`src/core/vbo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-vbo.Tpo src/core/$(DEPDIR)/gource-vbo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/vbo.cpp' object='src/core/gource-vbo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-vbo.o `test -f 'src/core/vbo.cpp' || echo '$(srcdir)/'`src/core/vbo.cpp src/core/gource-vbo.obj: src/core/vbo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-vbo.obj -MD -MP -MF src/core/$(DEPDIR)/gource-vbo.Tpo -c -o src/core/gource-vbo.obj `if test -f 'src/core/vbo.cpp'; then $(CYGPATH_W) 'src/core/vbo.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/vbo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-vbo.Tpo src/core/$(DEPDIR)/gource-vbo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/vbo.cpp' object='src/core/gource-vbo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-vbo.obj `if test -f 'src/core/vbo.cpp'; then $(CYGPATH_W) 'src/core/vbo.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/vbo.cpp'; fi` src/core/gource-vectors.o: src/core/vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-vectors.o -MD -MP -MF src/core/$(DEPDIR)/gource-vectors.Tpo -c -o src/core/gource-vectors.o `test -f 'src/core/vectors.cpp' || echo '$(srcdir)/'`src/core/vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-vectors.Tpo src/core/$(DEPDIR)/gource-vectors.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/vectors.cpp' object='src/core/gource-vectors.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-vectors.o `test -f 'src/core/vectors.cpp' || echo '$(srcdir)/'`src/core/vectors.cpp src/core/gource-vectors.obj: src/core/vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource-vectors.obj -MD -MP -MF src/core/$(DEPDIR)/gource-vectors.Tpo -c -o src/core/gource-vectors.obj `if test -f 'src/core/vectors.cpp'; then $(CYGPATH_W) 'src/core/vectors.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/vectors.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource-vectors.Tpo src/core/$(DEPDIR)/gource-vectors.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/vectors.cpp' object='src/core/gource-vectors.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource-vectors.obj `if test -f 'src/core/vectors.cpp'; then $(CYGPATH_W) 'src/core/vectors.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/vectors.cpp'; fi` src/gource-dirnode.o: src/dirnode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-dirnode.o -MD -MP -MF src/$(DEPDIR)/gource-dirnode.Tpo -c -o src/gource-dirnode.o `test -f 'src/dirnode.cpp' || echo '$(srcdir)/'`src/dirnode.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-dirnode.Tpo src/$(DEPDIR)/gource-dirnode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/dirnode.cpp' object='src/gource-dirnode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-dirnode.o `test -f 'src/dirnode.cpp' || echo '$(srcdir)/'`src/dirnode.cpp src/gource-dirnode.obj: src/dirnode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-dirnode.obj -MD -MP -MF src/$(DEPDIR)/gource-dirnode.Tpo -c -o src/gource-dirnode.obj `if test -f 'src/dirnode.cpp'; then $(CYGPATH_W) 'src/dirnode.cpp'; else $(CYGPATH_W) '$(srcdir)/src/dirnode.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-dirnode.Tpo src/$(DEPDIR)/gource-dirnode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/dirnode.cpp' object='src/gource-dirnode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-dirnode.obj `if test -f 'src/dirnode.cpp'; then $(CYGPATH_W) 'src/dirnode.cpp'; else $(CYGPATH_W) '$(srcdir)/src/dirnode.cpp'; fi` src/gource-file.o: src/file.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-file.o -MD -MP -MF src/$(DEPDIR)/gource-file.Tpo -c -o src/gource-file.o `test -f 'src/file.cpp' || echo '$(srcdir)/'`src/file.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-file.Tpo src/$(DEPDIR)/gource-file.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/file.cpp' object='src/gource-file.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-file.o `test -f 'src/file.cpp' || echo '$(srcdir)/'`src/file.cpp src/gource-file.obj: src/file.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-file.obj -MD -MP -MF src/$(DEPDIR)/gource-file.Tpo -c -o src/gource-file.obj `if test -f 'src/file.cpp'; then $(CYGPATH_W) 'src/file.cpp'; else $(CYGPATH_W) '$(srcdir)/src/file.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-file.Tpo src/$(DEPDIR)/gource-file.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/file.cpp' object='src/gource-file.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-file.obj `if test -f 'src/file.cpp'; then $(CYGPATH_W) 'src/file.cpp'; else $(CYGPATH_W) '$(srcdir)/src/file.cpp'; fi` src/formats/gource-apache.o: src/formats/apache.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-apache.o -MD -MP -MF src/formats/$(DEPDIR)/gource-apache.Tpo -c -o src/formats/gource-apache.o `test -f 'src/formats/apache.cpp' || echo '$(srcdir)/'`src/formats/apache.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-apache.Tpo src/formats/$(DEPDIR)/gource-apache.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/apache.cpp' object='src/formats/gource-apache.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-apache.o `test -f 'src/formats/apache.cpp' || echo '$(srcdir)/'`src/formats/apache.cpp src/formats/gource-apache.obj: src/formats/apache.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-apache.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-apache.Tpo -c -o src/formats/gource-apache.obj `if test -f 'src/formats/apache.cpp'; then $(CYGPATH_W) 'src/formats/apache.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/apache.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-apache.Tpo src/formats/$(DEPDIR)/gource-apache.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/apache.cpp' object='src/formats/gource-apache.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-apache.obj `if test -f 'src/formats/apache.cpp'; then $(CYGPATH_W) 'src/formats/apache.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/apache.cpp'; fi` src/formats/gource-bzr.o: src/formats/bzr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-bzr.o -MD -MP -MF src/formats/$(DEPDIR)/gource-bzr.Tpo -c -o src/formats/gource-bzr.o `test -f 'src/formats/bzr.cpp' || echo '$(srcdir)/'`src/formats/bzr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-bzr.Tpo src/formats/$(DEPDIR)/gource-bzr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/bzr.cpp' object='src/formats/gource-bzr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-bzr.o `test -f 'src/formats/bzr.cpp' || echo '$(srcdir)/'`src/formats/bzr.cpp src/formats/gource-bzr.obj: src/formats/bzr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-bzr.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-bzr.Tpo -c -o src/formats/gource-bzr.obj `if test -f 'src/formats/bzr.cpp'; then $(CYGPATH_W) 'src/formats/bzr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/bzr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-bzr.Tpo src/formats/$(DEPDIR)/gource-bzr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/bzr.cpp' object='src/formats/gource-bzr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-bzr.obj `if test -f 'src/formats/bzr.cpp'; then $(CYGPATH_W) 'src/formats/bzr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/bzr.cpp'; fi` src/formats/gource-commitlog.o: src/formats/commitlog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-commitlog.o -MD -MP -MF src/formats/$(DEPDIR)/gource-commitlog.Tpo -c -o src/formats/gource-commitlog.o `test -f 'src/formats/commitlog.cpp' || echo '$(srcdir)/'`src/formats/commitlog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-commitlog.Tpo src/formats/$(DEPDIR)/gource-commitlog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/commitlog.cpp' object='src/formats/gource-commitlog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-commitlog.o `test -f 'src/formats/commitlog.cpp' || echo '$(srcdir)/'`src/formats/commitlog.cpp src/formats/gource-commitlog.obj: src/formats/commitlog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-commitlog.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-commitlog.Tpo -c -o src/formats/gource-commitlog.obj `if test -f 'src/formats/commitlog.cpp'; then $(CYGPATH_W) 'src/formats/commitlog.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/commitlog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-commitlog.Tpo src/formats/$(DEPDIR)/gource-commitlog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/commitlog.cpp' object='src/formats/gource-commitlog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-commitlog.obj `if test -f 'src/formats/commitlog.cpp'; then $(CYGPATH_W) 'src/formats/commitlog.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/commitlog.cpp'; fi` src/formats/gource-custom.o: src/formats/custom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-custom.o -MD -MP -MF src/formats/$(DEPDIR)/gource-custom.Tpo -c -o src/formats/gource-custom.o `test -f 'src/formats/custom.cpp' || echo '$(srcdir)/'`src/formats/custom.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-custom.Tpo src/formats/$(DEPDIR)/gource-custom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/custom.cpp' object='src/formats/gource-custom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-custom.o `test -f 'src/formats/custom.cpp' || echo '$(srcdir)/'`src/formats/custom.cpp src/formats/gource-custom.obj: src/formats/custom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-custom.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-custom.Tpo -c -o src/formats/gource-custom.obj `if test -f 'src/formats/custom.cpp'; then $(CYGPATH_W) 'src/formats/custom.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/custom.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-custom.Tpo src/formats/$(DEPDIR)/gource-custom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/custom.cpp' object='src/formats/gource-custom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-custom.obj `if test -f 'src/formats/custom.cpp'; then $(CYGPATH_W) 'src/formats/custom.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/custom.cpp'; fi` src/formats/gource-cvs-exp.o: src/formats/cvs-exp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-cvs-exp.o -MD -MP -MF src/formats/$(DEPDIR)/gource-cvs-exp.Tpo -c -o src/formats/gource-cvs-exp.o `test -f 'src/formats/cvs-exp.cpp' || echo '$(srcdir)/'`src/formats/cvs-exp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-cvs-exp.Tpo src/formats/$(DEPDIR)/gource-cvs-exp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/cvs-exp.cpp' object='src/formats/gource-cvs-exp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-cvs-exp.o `test -f 'src/formats/cvs-exp.cpp' || echo '$(srcdir)/'`src/formats/cvs-exp.cpp src/formats/gource-cvs-exp.obj: src/formats/cvs-exp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-cvs-exp.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-cvs-exp.Tpo -c -o src/formats/gource-cvs-exp.obj `if test -f 'src/formats/cvs-exp.cpp'; then $(CYGPATH_W) 'src/formats/cvs-exp.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/cvs-exp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-cvs-exp.Tpo src/formats/$(DEPDIR)/gource-cvs-exp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/cvs-exp.cpp' object='src/formats/gource-cvs-exp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-cvs-exp.obj `if test -f 'src/formats/cvs-exp.cpp'; then $(CYGPATH_W) 'src/formats/cvs-exp.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/cvs-exp.cpp'; fi` src/formats/gource-cvs2cl.o: src/formats/cvs2cl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-cvs2cl.o -MD -MP -MF src/formats/$(DEPDIR)/gource-cvs2cl.Tpo -c -o src/formats/gource-cvs2cl.o `test -f 'src/formats/cvs2cl.cpp' || echo '$(srcdir)/'`src/formats/cvs2cl.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-cvs2cl.Tpo src/formats/$(DEPDIR)/gource-cvs2cl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/cvs2cl.cpp' object='src/formats/gource-cvs2cl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-cvs2cl.o `test -f 'src/formats/cvs2cl.cpp' || echo '$(srcdir)/'`src/formats/cvs2cl.cpp src/formats/gource-cvs2cl.obj: src/formats/cvs2cl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-cvs2cl.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-cvs2cl.Tpo -c -o src/formats/gource-cvs2cl.obj `if test -f 'src/formats/cvs2cl.cpp'; then $(CYGPATH_W) 'src/formats/cvs2cl.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/cvs2cl.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-cvs2cl.Tpo src/formats/$(DEPDIR)/gource-cvs2cl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/cvs2cl.cpp' object='src/formats/gource-cvs2cl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-cvs2cl.obj `if test -f 'src/formats/cvs2cl.cpp'; then $(CYGPATH_W) 'src/formats/cvs2cl.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/cvs2cl.cpp'; fi` src/formats/gource-git.o: src/formats/git.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-git.o -MD -MP -MF src/formats/$(DEPDIR)/gource-git.Tpo -c -o src/formats/gource-git.o `test -f 'src/formats/git.cpp' || echo '$(srcdir)/'`src/formats/git.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-git.Tpo src/formats/$(DEPDIR)/gource-git.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/git.cpp' object='src/formats/gource-git.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-git.o `test -f 'src/formats/git.cpp' || echo '$(srcdir)/'`src/formats/git.cpp src/formats/gource-git.obj: src/formats/git.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-git.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-git.Tpo -c -o src/formats/gource-git.obj `if test -f 'src/formats/git.cpp'; then $(CYGPATH_W) 'src/formats/git.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/git.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-git.Tpo src/formats/$(DEPDIR)/gource-git.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/git.cpp' object='src/formats/gource-git.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-git.obj `if test -f 'src/formats/git.cpp'; then $(CYGPATH_W) 'src/formats/git.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/git.cpp'; fi` src/formats/gource-gitraw.o: src/formats/gitraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-gitraw.o -MD -MP -MF src/formats/$(DEPDIR)/gource-gitraw.Tpo -c -o src/formats/gource-gitraw.o `test -f 'src/formats/gitraw.cpp' || echo '$(srcdir)/'`src/formats/gitraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-gitraw.Tpo src/formats/$(DEPDIR)/gource-gitraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/gitraw.cpp' object='src/formats/gource-gitraw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-gitraw.o `test -f 'src/formats/gitraw.cpp' || echo '$(srcdir)/'`src/formats/gitraw.cpp src/formats/gource-gitraw.obj: src/formats/gitraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-gitraw.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-gitraw.Tpo -c -o src/formats/gource-gitraw.obj `if test -f 'src/formats/gitraw.cpp'; then $(CYGPATH_W) 'src/formats/gitraw.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/gitraw.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-gitraw.Tpo src/formats/$(DEPDIR)/gource-gitraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/gitraw.cpp' object='src/formats/gource-gitraw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-gitraw.obj `if test -f 'src/formats/gitraw.cpp'; then $(CYGPATH_W) 'src/formats/gitraw.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/gitraw.cpp'; fi` src/formats/gource-hg.o: src/formats/hg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-hg.o -MD -MP -MF src/formats/$(DEPDIR)/gource-hg.Tpo -c -o src/formats/gource-hg.o `test -f 'src/formats/hg.cpp' || echo '$(srcdir)/'`src/formats/hg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-hg.Tpo src/formats/$(DEPDIR)/gource-hg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/hg.cpp' object='src/formats/gource-hg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-hg.o `test -f 'src/formats/hg.cpp' || echo '$(srcdir)/'`src/formats/hg.cpp src/formats/gource-hg.obj: src/formats/hg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-hg.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-hg.Tpo -c -o src/formats/gource-hg.obj `if test -f 'src/formats/hg.cpp'; then $(CYGPATH_W) 'src/formats/hg.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/hg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-hg.Tpo src/formats/$(DEPDIR)/gource-hg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/hg.cpp' object='src/formats/gource-hg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-hg.obj `if test -f 'src/formats/hg.cpp'; then $(CYGPATH_W) 'src/formats/hg.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/hg.cpp'; fi` src/formats/gource-svn.o: src/formats/svn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-svn.o -MD -MP -MF src/formats/$(DEPDIR)/gource-svn.Tpo -c -o src/formats/gource-svn.o `test -f 'src/formats/svn.cpp' || echo '$(srcdir)/'`src/formats/svn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-svn.Tpo src/formats/$(DEPDIR)/gource-svn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/svn.cpp' object='src/formats/gource-svn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-svn.o `test -f 'src/formats/svn.cpp' || echo '$(srcdir)/'`src/formats/svn.cpp src/formats/gource-svn.obj: src/formats/svn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource-svn.obj -MD -MP -MF src/formats/$(DEPDIR)/gource-svn.Tpo -c -o src/formats/gource-svn.obj `if test -f 'src/formats/svn.cpp'; then $(CYGPATH_W) 'src/formats/svn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/svn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource-svn.Tpo src/formats/$(DEPDIR)/gource-svn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/svn.cpp' object='src/formats/gource-svn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource-svn.obj `if test -f 'src/formats/svn.cpp'; then $(CYGPATH_W) 'src/formats/svn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/svn.cpp'; fi` src/gource-gource.o: src/gource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-gource.o -MD -MP -MF src/$(DEPDIR)/gource-gource.Tpo -c -o src/gource-gource.o `test -f 'src/gource.cpp' || echo '$(srcdir)/'`src/gource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-gource.Tpo src/$(DEPDIR)/gource-gource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource.cpp' object='src/gource-gource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-gource.o `test -f 'src/gource.cpp' || echo '$(srcdir)/'`src/gource.cpp src/gource-gource.obj: src/gource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-gource.obj -MD -MP -MF src/$(DEPDIR)/gource-gource.Tpo -c -o src/gource-gource.obj `if test -f 'src/gource.cpp'; then $(CYGPATH_W) 'src/gource.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-gource.Tpo src/$(DEPDIR)/gource-gource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource.cpp' object='src/gource-gource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-gource.obj `if test -f 'src/gource.cpp'; then $(CYGPATH_W) 'src/gource.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource.cpp'; fi` src/gource-gource_shell.o: src/gource_shell.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-gource_shell.o -MD -MP -MF src/$(DEPDIR)/gource-gource_shell.Tpo -c -o src/gource-gource_shell.o `test -f 'src/gource_shell.cpp' || echo '$(srcdir)/'`src/gource_shell.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-gource_shell.Tpo src/$(DEPDIR)/gource-gource_shell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource_shell.cpp' object='src/gource-gource_shell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-gource_shell.o `test -f 'src/gource_shell.cpp' || echo '$(srcdir)/'`src/gource_shell.cpp src/gource-gource_shell.obj: src/gource_shell.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-gource_shell.obj -MD -MP -MF src/$(DEPDIR)/gource-gource_shell.Tpo -c -o src/gource-gource_shell.obj `if test -f 'src/gource_shell.cpp'; then $(CYGPATH_W) 'src/gource_shell.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource_shell.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-gource_shell.Tpo src/$(DEPDIR)/gource-gource_shell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource_shell.cpp' object='src/gource-gource_shell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-gource_shell.obj `if test -f 'src/gource_shell.cpp'; then $(CYGPATH_W) 'src/gource_shell.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource_shell.cpp'; fi` src/gource-gource_settings.o: src/gource_settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-gource_settings.o -MD -MP -MF src/$(DEPDIR)/gource-gource_settings.Tpo -c -o src/gource-gource_settings.o `test -f 'src/gource_settings.cpp' || echo '$(srcdir)/'`src/gource_settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-gource_settings.Tpo src/$(DEPDIR)/gource-gource_settings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource_settings.cpp' object='src/gource-gource_settings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-gource_settings.o `test -f 'src/gource_settings.cpp' || echo '$(srcdir)/'`src/gource_settings.cpp src/gource-gource_settings.obj: src/gource_settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-gource_settings.obj -MD -MP -MF src/$(DEPDIR)/gource-gource_settings.Tpo -c -o src/gource-gource_settings.obj `if test -f 'src/gource_settings.cpp'; then $(CYGPATH_W) 'src/gource_settings.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource_settings.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-gource_settings.Tpo src/$(DEPDIR)/gource-gource_settings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource_settings.cpp' object='src/gource-gource_settings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-gource_settings.obj `if test -f 'src/gource_settings.cpp'; then $(CYGPATH_W) 'src/gource_settings.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource_settings.cpp'; fi` src/gource-key.o: src/key.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-key.o -MD -MP -MF src/$(DEPDIR)/gource-key.Tpo -c -o src/gource-key.o `test -f 'src/key.cpp' || echo '$(srcdir)/'`src/key.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-key.Tpo src/$(DEPDIR)/gource-key.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/key.cpp' object='src/gource-key.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-key.o `test -f 'src/key.cpp' || echo '$(srcdir)/'`src/key.cpp src/gource-key.obj: src/key.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-key.obj -MD -MP -MF src/$(DEPDIR)/gource-key.Tpo -c -o src/gource-key.obj `if test -f 'src/key.cpp'; then $(CYGPATH_W) 'src/key.cpp'; else $(CYGPATH_W) '$(srcdir)/src/key.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-key.Tpo src/$(DEPDIR)/gource-key.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/key.cpp' object='src/gource-key.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-key.obj `if test -f 'src/key.cpp'; then $(CYGPATH_W) 'src/key.cpp'; else $(CYGPATH_W) '$(srcdir)/src/key.cpp'; fi` src/gource-logmill.o: src/logmill.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-logmill.o -MD -MP -MF src/$(DEPDIR)/gource-logmill.Tpo -c -o src/gource-logmill.o `test -f 'src/logmill.cpp' || echo '$(srcdir)/'`src/logmill.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-logmill.Tpo src/$(DEPDIR)/gource-logmill.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/logmill.cpp' object='src/gource-logmill.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-logmill.o `test -f 'src/logmill.cpp' || echo '$(srcdir)/'`src/logmill.cpp src/gource-logmill.obj: src/logmill.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-logmill.obj -MD -MP -MF src/$(DEPDIR)/gource-logmill.Tpo -c -o src/gource-logmill.obj `if test -f 'src/logmill.cpp'; then $(CYGPATH_W) 'src/logmill.cpp'; else $(CYGPATH_W) '$(srcdir)/src/logmill.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-logmill.Tpo src/$(DEPDIR)/gource-logmill.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/logmill.cpp' object='src/gource-logmill.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-logmill.obj `if test -f 'src/logmill.cpp'; then $(CYGPATH_W) 'src/logmill.cpp'; else $(CYGPATH_W) '$(srcdir)/src/logmill.cpp'; fi` src/gource-pawn.o: src/pawn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-pawn.o -MD -MP -MF src/$(DEPDIR)/gource-pawn.Tpo -c -o src/gource-pawn.o `test -f 'src/pawn.cpp' || echo '$(srcdir)/'`src/pawn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-pawn.Tpo src/$(DEPDIR)/gource-pawn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/pawn.cpp' object='src/gource-pawn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-pawn.o `test -f 'src/pawn.cpp' || echo '$(srcdir)/'`src/pawn.cpp src/gource-pawn.obj: src/pawn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-pawn.obj -MD -MP -MF src/$(DEPDIR)/gource-pawn.Tpo -c -o src/gource-pawn.obj `if test -f 'src/pawn.cpp'; then $(CYGPATH_W) 'src/pawn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/pawn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-pawn.Tpo src/$(DEPDIR)/gource-pawn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/pawn.cpp' object='src/gource-pawn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-pawn.obj `if test -f 'src/pawn.cpp'; then $(CYGPATH_W) 'src/pawn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/pawn.cpp'; fi` src/gource-slider.o: src/slider.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-slider.o -MD -MP -MF src/$(DEPDIR)/gource-slider.Tpo -c -o src/gource-slider.o `test -f 'src/slider.cpp' || echo '$(srcdir)/'`src/slider.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-slider.Tpo src/$(DEPDIR)/gource-slider.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/slider.cpp' object='src/gource-slider.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-slider.o `test -f 'src/slider.cpp' || echo '$(srcdir)/'`src/slider.cpp src/gource-slider.obj: src/slider.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-slider.obj -MD -MP -MF src/$(DEPDIR)/gource-slider.Tpo -c -o src/gource-slider.obj `if test -f 'src/slider.cpp'; then $(CYGPATH_W) 'src/slider.cpp'; else $(CYGPATH_W) '$(srcdir)/src/slider.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-slider.Tpo src/$(DEPDIR)/gource-slider.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/slider.cpp' object='src/gource-slider.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-slider.obj `if test -f 'src/slider.cpp'; then $(CYGPATH_W) 'src/slider.cpp'; else $(CYGPATH_W) '$(srcdir)/src/slider.cpp'; fi` src/gource-spline.o: src/spline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-spline.o -MD -MP -MF src/$(DEPDIR)/gource-spline.Tpo -c -o src/gource-spline.o `test -f 'src/spline.cpp' || echo '$(srcdir)/'`src/spline.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-spline.Tpo src/$(DEPDIR)/gource-spline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/spline.cpp' object='src/gource-spline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-spline.o `test -f 'src/spline.cpp' || echo '$(srcdir)/'`src/spline.cpp src/gource-spline.obj: src/spline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-spline.obj -MD -MP -MF src/$(DEPDIR)/gource-spline.Tpo -c -o src/gource-spline.obj `if test -f 'src/spline.cpp'; then $(CYGPATH_W) 'src/spline.cpp'; else $(CYGPATH_W) '$(srcdir)/src/spline.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-spline.Tpo src/$(DEPDIR)/gource-spline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/spline.cpp' object='src/gource-spline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-spline.obj `if test -f 'src/spline.cpp'; then $(CYGPATH_W) 'src/spline.cpp'; else $(CYGPATH_W) '$(srcdir)/src/spline.cpp'; fi` src/gource-textbox.o: src/textbox.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-textbox.o -MD -MP -MF src/$(DEPDIR)/gource-textbox.Tpo -c -o src/gource-textbox.o `test -f 'src/textbox.cpp' || echo '$(srcdir)/'`src/textbox.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-textbox.Tpo src/$(DEPDIR)/gource-textbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/textbox.cpp' object='src/gource-textbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-textbox.o `test -f 'src/textbox.cpp' || echo '$(srcdir)/'`src/textbox.cpp src/gource-textbox.obj: src/textbox.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-textbox.obj -MD -MP -MF src/$(DEPDIR)/gource-textbox.Tpo -c -o src/gource-textbox.obj `if test -f 'src/textbox.cpp'; then $(CYGPATH_W) 'src/textbox.cpp'; else $(CYGPATH_W) '$(srcdir)/src/textbox.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-textbox.Tpo src/$(DEPDIR)/gource-textbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/textbox.cpp' object='src/gource-textbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-textbox.obj `if test -f 'src/textbox.cpp'; then $(CYGPATH_W) 'src/textbox.cpp'; else $(CYGPATH_W) '$(srcdir)/src/textbox.cpp'; fi` src/gource-user.o: src/user.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-user.o -MD -MP -MF src/$(DEPDIR)/gource-user.Tpo -c -o src/gource-user.o `test -f 'src/user.cpp' || echo '$(srcdir)/'`src/user.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-user.Tpo src/$(DEPDIR)/gource-user.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/user.cpp' object='src/gource-user.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-user.o `test -f 'src/user.cpp' || echo '$(srcdir)/'`src/user.cpp src/gource-user.obj: src/user.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-user.obj -MD -MP -MF src/$(DEPDIR)/gource-user.Tpo -c -o src/gource-user.obj `if test -f 'src/user.cpp'; then $(CYGPATH_W) 'src/user.cpp'; else $(CYGPATH_W) '$(srcdir)/src/user.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-user.Tpo src/$(DEPDIR)/gource-user.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/user.cpp' object='src/gource-user.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-user.obj `if test -f 'src/user.cpp'; then $(CYGPATH_W) 'src/user.cpp'; else $(CYGPATH_W) '$(srcdir)/src/user.cpp'; fi` src/gource-zoomcamera.o: src/zoomcamera.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-zoomcamera.o -MD -MP -MF src/$(DEPDIR)/gource-zoomcamera.Tpo -c -o src/gource-zoomcamera.o `test -f 'src/zoomcamera.cpp' || echo '$(srcdir)/'`src/zoomcamera.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-zoomcamera.Tpo src/$(DEPDIR)/gource-zoomcamera.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/zoomcamera.cpp' object='src/gource-zoomcamera.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-zoomcamera.o `test -f 'src/zoomcamera.cpp' || echo '$(srcdir)/'`src/zoomcamera.cpp src/gource-zoomcamera.obj: src/zoomcamera.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/gource-zoomcamera.obj -MD -MP -MF src/$(DEPDIR)/gource-zoomcamera.Tpo -c -o src/gource-zoomcamera.obj `if test -f 'src/zoomcamera.cpp'; then $(CYGPATH_W) 'src/zoomcamera.cpp'; else $(CYGPATH_W) '$(srcdir)/src/zoomcamera.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource-zoomcamera.Tpo src/$(DEPDIR)/gource-zoomcamera.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/zoomcamera.cpp' object='src/gource-zoomcamera.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/gource-zoomcamera.obj `if test -f 'src/zoomcamera.cpp'; then $(CYGPATH_W) 'src/zoomcamera.cpp'; else $(CYGPATH_W) '$(srcdir)/src/zoomcamera.cpp'; fi` src/tinyxml/gource-tinyxmlerror.o: src/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource-tinyxmlerror.o -MD -MP -MF src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Tpo -c -o src/tinyxml/gource-tinyxmlerror.o `test -f 'src/tinyxml/tinyxmlerror.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Tpo src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxmlerror.cpp' object='src/tinyxml/gource-tinyxmlerror.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource-tinyxmlerror.o `test -f 'src/tinyxml/tinyxmlerror.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxmlerror.cpp src/tinyxml/gource-tinyxmlerror.obj: src/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource-tinyxmlerror.obj -MD -MP -MF src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Tpo -c -o src/tinyxml/gource-tinyxmlerror.obj `if test -f 'src/tinyxml/tinyxmlerror.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxmlerror.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Tpo src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxmlerror.cpp' object='src/tinyxml/gource-tinyxmlerror.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource-tinyxmlerror.obj `if test -f 'src/tinyxml/tinyxmlerror.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxmlerror.cpp'; fi` src/tinyxml/gource-tinystr.o: src/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource-tinystr.o -MD -MP -MF src/tinyxml/$(DEPDIR)/gource-tinystr.Tpo -c -o src/tinyxml/gource-tinystr.o `test -f 'src/tinyxml/tinystr.cpp' || echo '$(srcdir)/'`src/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource-tinystr.Tpo src/tinyxml/$(DEPDIR)/gource-tinystr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinystr.cpp' object='src/tinyxml/gource-tinystr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource-tinystr.o `test -f 'src/tinyxml/tinystr.cpp' || echo '$(srcdir)/'`src/tinyxml/tinystr.cpp src/tinyxml/gource-tinystr.obj: src/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource-tinystr.obj -MD -MP -MF src/tinyxml/$(DEPDIR)/gource-tinystr.Tpo -c -o src/tinyxml/gource-tinystr.obj `if test -f 'src/tinyxml/tinystr.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinystr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource-tinystr.Tpo src/tinyxml/$(DEPDIR)/gource-tinystr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinystr.cpp' object='src/tinyxml/gource-tinystr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource-tinystr.obj `if test -f 'src/tinyxml/tinystr.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinystr.cpp'; fi` src/tinyxml/gource-tinyxml.o: src/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource-tinyxml.o -MD -MP -MF src/tinyxml/$(DEPDIR)/gource-tinyxml.Tpo -c -o src/tinyxml/gource-tinyxml.o `test -f 'src/tinyxml/tinyxml.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource-tinyxml.Tpo src/tinyxml/$(DEPDIR)/gource-tinyxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxml.cpp' object='src/tinyxml/gource-tinyxml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource-tinyxml.o `test -f 'src/tinyxml/tinyxml.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxml.cpp src/tinyxml/gource-tinyxml.obj: src/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource-tinyxml.obj -MD -MP -MF src/tinyxml/$(DEPDIR)/gource-tinyxml.Tpo -c -o src/tinyxml/gource-tinyxml.obj `if test -f 'src/tinyxml/tinyxml.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxml.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource-tinyxml.Tpo src/tinyxml/$(DEPDIR)/gource-tinyxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxml.cpp' object='src/tinyxml/gource-tinyxml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource-tinyxml.obj `if test -f 'src/tinyxml/tinyxml.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxml.cpp'; fi` src/tinyxml/gource-tinyxmlparser.o: src/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource-tinyxmlparser.o -MD -MP -MF src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Tpo -c -o src/tinyxml/gource-tinyxmlparser.o `test -f 'src/tinyxml/tinyxmlparser.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Tpo src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxmlparser.cpp' object='src/tinyxml/gource-tinyxmlparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource-tinyxmlparser.o `test -f 'src/tinyxml/tinyxmlparser.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxmlparser.cpp src/tinyxml/gource-tinyxmlparser.obj: src/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource-tinyxmlparser.obj -MD -MP -MF src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Tpo -c -o src/tinyxml/gource-tinyxmlparser.obj `if test -f 'src/tinyxml/tinyxmlparser.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxmlparser.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Tpo src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxmlparser.cpp' object='src/tinyxml/gource-tinyxmlparser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gource_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource-tinyxmlparser.obj `if test -f 'src/tinyxml/tinyxmlparser.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxmlparser.cpp'; fi` src/test/gource_tests-main.o: src/test/main.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/test/gource_tests-main.o -MD -MP -MF src/test/$(DEPDIR)/gource_tests-main.Tpo -c -o src/test/gource_tests-main.o `test -f 'src/test/main.cpp' || echo '$(srcdir)/'`src/test/main.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/test/$(DEPDIR)/gource_tests-main.Tpo src/test/$(DEPDIR)/gource_tests-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test/main.cpp' object='src/test/gource_tests-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/test/gource_tests-main.o `test -f 'src/test/main.cpp' || echo '$(srcdir)/'`src/test/main.cpp src/test/gource_tests-main.obj: src/test/main.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/test/gource_tests-main.obj -MD -MP -MF src/test/$(DEPDIR)/gource_tests-main.Tpo -c -o src/test/gource_tests-main.obj `if test -f 'src/test/main.cpp'; then $(CYGPATH_W) 'src/test/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/test/main.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/test/$(DEPDIR)/gource_tests-main.Tpo src/test/$(DEPDIR)/gource_tests-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test/main.cpp' object='src/test/gource_tests-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/test/gource_tests-main.obj `if test -f 'src/test/main.cpp'; then $(CYGPATH_W) 'src/test/main.cpp'; else $(CYGPATH_W) '$(srcdir)/src/test/main.cpp'; fi` src/test/gource_tests-datetime_tests.o: src/test/datetime_tests.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/test/gource_tests-datetime_tests.o -MD -MP -MF src/test/$(DEPDIR)/gource_tests-datetime_tests.Tpo -c -o src/test/gource_tests-datetime_tests.o `test -f 'src/test/datetime_tests.cpp' || echo '$(srcdir)/'`src/test/datetime_tests.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/test/$(DEPDIR)/gource_tests-datetime_tests.Tpo src/test/$(DEPDIR)/gource_tests-datetime_tests.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test/datetime_tests.cpp' object='src/test/gource_tests-datetime_tests.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/test/gource_tests-datetime_tests.o `test -f 'src/test/datetime_tests.cpp' || echo '$(srcdir)/'`src/test/datetime_tests.cpp src/test/gource_tests-datetime_tests.obj: src/test/datetime_tests.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/test/gource_tests-datetime_tests.obj -MD -MP -MF src/test/$(DEPDIR)/gource_tests-datetime_tests.Tpo -c -o src/test/gource_tests-datetime_tests.obj `if test -f 'src/test/datetime_tests.cpp'; then $(CYGPATH_W) 'src/test/datetime_tests.cpp'; else $(CYGPATH_W) '$(srcdir)/src/test/datetime_tests.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/test/$(DEPDIR)/gource_tests-datetime_tests.Tpo src/test/$(DEPDIR)/gource_tests-datetime_tests.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test/datetime_tests.cpp' object='src/test/gource_tests-datetime_tests.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/test/gource_tests-datetime_tests.obj `if test -f 'src/test/datetime_tests.cpp'; then $(CYGPATH_W) 'src/test/datetime_tests.cpp'; else $(CYGPATH_W) '$(srcdir)/src/test/datetime_tests.cpp'; fi` src/test/gource_tests-regex_tests.o: src/test/regex_tests.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/test/gource_tests-regex_tests.o -MD -MP -MF src/test/$(DEPDIR)/gource_tests-regex_tests.Tpo -c -o src/test/gource_tests-regex_tests.o `test -f 'src/test/regex_tests.cpp' || echo '$(srcdir)/'`src/test/regex_tests.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/test/$(DEPDIR)/gource_tests-regex_tests.Tpo src/test/$(DEPDIR)/gource_tests-regex_tests.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test/regex_tests.cpp' object='src/test/gource_tests-regex_tests.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/test/gource_tests-regex_tests.o `test -f 'src/test/regex_tests.cpp' || echo '$(srcdir)/'`src/test/regex_tests.cpp src/test/gource_tests-regex_tests.obj: src/test/regex_tests.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/test/gource_tests-regex_tests.obj -MD -MP -MF src/test/$(DEPDIR)/gource_tests-regex_tests.Tpo -c -o src/test/gource_tests-regex_tests.obj `if test -f 'src/test/regex_tests.cpp'; then $(CYGPATH_W) 'src/test/regex_tests.cpp'; else $(CYGPATH_W) '$(srcdir)/src/test/regex_tests.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/test/$(DEPDIR)/gource_tests-regex_tests.Tpo src/test/$(DEPDIR)/gource_tests-regex_tests.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/test/regex_tests.cpp' object='src/test/gource_tests-regex_tests.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/test/gource_tests-regex_tests.obj `if test -f 'src/test/regex_tests.cpp'; then $(CYGPATH_W) 'src/test/regex_tests.cpp'; else $(CYGPATH_W) '$(srcdir)/src/test/regex_tests.cpp'; fi` src/gource_tests-action.o: src/action.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-action.o -MD -MP -MF src/$(DEPDIR)/gource_tests-action.Tpo -c -o src/gource_tests-action.o `test -f 'src/action.cpp' || echo '$(srcdir)/'`src/action.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-action.Tpo src/$(DEPDIR)/gource_tests-action.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/action.cpp' object='src/gource_tests-action.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-action.o `test -f 'src/action.cpp' || echo '$(srcdir)/'`src/action.cpp src/gource_tests-action.obj: src/action.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-action.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-action.Tpo -c -o src/gource_tests-action.obj `if test -f 'src/action.cpp'; then $(CYGPATH_W) 'src/action.cpp'; else $(CYGPATH_W) '$(srcdir)/src/action.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-action.Tpo src/$(DEPDIR)/gource_tests-action.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/action.cpp' object='src/gource_tests-action.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-action.obj `if test -f 'src/action.cpp'; then $(CYGPATH_W) 'src/action.cpp'; else $(CYGPATH_W) '$(srcdir)/src/action.cpp'; fi` src/gource_tests-bloom.o: src/bloom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-bloom.o -MD -MP -MF src/$(DEPDIR)/gource_tests-bloom.Tpo -c -o src/gource_tests-bloom.o `test -f 'src/bloom.cpp' || echo '$(srcdir)/'`src/bloom.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-bloom.Tpo src/$(DEPDIR)/gource_tests-bloom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/bloom.cpp' object='src/gource_tests-bloom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-bloom.o `test -f 'src/bloom.cpp' || echo '$(srcdir)/'`src/bloom.cpp src/gource_tests-bloom.obj: src/bloom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-bloom.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-bloom.Tpo -c -o src/gource_tests-bloom.obj `if test -f 'src/bloom.cpp'; then $(CYGPATH_W) 'src/bloom.cpp'; else $(CYGPATH_W) '$(srcdir)/src/bloom.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-bloom.Tpo src/$(DEPDIR)/gource_tests-bloom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/bloom.cpp' object='src/gource_tests-bloom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-bloom.obj `if test -f 'src/bloom.cpp'; then $(CYGPATH_W) 'src/bloom.cpp'; else $(CYGPATH_W) '$(srcdir)/src/bloom.cpp'; fi` src/gource_tests-caption.o: src/caption.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-caption.o -MD -MP -MF src/$(DEPDIR)/gource_tests-caption.Tpo -c -o src/gource_tests-caption.o `test -f 'src/caption.cpp' || echo '$(srcdir)/'`src/caption.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-caption.Tpo src/$(DEPDIR)/gource_tests-caption.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/caption.cpp' object='src/gource_tests-caption.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-caption.o `test -f 'src/caption.cpp' || echo '$(srcdir)/'`src/caption.cpp src/gource_tests-caption.obj: src/caption.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-caption.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-caption.Tpo -c -o src/gource_tests-caption.obj `if test -f 'src/caption.cpp'; then $(CYGPATH_W) 'src/caption.cpp'; else $(CYGPATH_W) '$(srcdir)/src/caption.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-caption.Tpo src/$(DEPDIR)/gource_tests-caption.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/caption.cpp' object='src/gource_tests-caption.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-caption.obj `if test -f 'src/caption.cpp'; then $(CYGPATH_W) 'src/caption.cpp'; else $(CYGPATH_W) '$(srcdir)/src/caption.cpp'; fi` src/core/gource_tests-conffile.o: src/core/conffile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-conffile.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-conffile.Tpo -c -o src/core/gource_tests-conffile.o `test -f 'src/core/conffile.cpp' || echo '$(srcdir)/'`src/core/conffile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-conffile.Tpo src/core/$(DEPDIR)/gource_tests-conffile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/conffile.cpp' object='src/core/gource_tests-conffile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-conffile.o `test -f 'src/core/conffile.cpp' || echo '$(srcdir)/'`src/core/conffile.cpp src/core/gource_tests-conffile.obj: src/core/conffile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-conffile.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-conffile.Tpo -c -o src/core/gource_tests-conffile.obj `if test -f 'src/core/conffile.cpp'; then $(CYGPATH_W) 'src/core/conffile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/conffile.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-conffile.Tpo src/core/$(DEPDIR)/gource_tests-conffile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/conffile.cpp' object='src/core/gource_tests-conffile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-conffile.obj `if test -f 'src/core/conffile.cpp'; then $(CYGPATH_W) 'src/core/conffile.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/conffile.cpp'; fi` src/core/gource_tests-display.o: src/core/display.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-display.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-display.Tpo -c -o src/core/gource_tests-display.o `test -f 'src/core/display.cpp' || echo '$(srcdir)/'`src/core/display.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-display.Tpo src/core/$(DEPDIR)/gource_tests-display.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/display.cpp' object='src/core/gource_tests-display.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-display.o `test -f 'src/core/display.cpp' || echo '$(srcdir)/'`src/core/display.cpp src/core/gource_tests-display.obj: src/core/display.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-display.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-display.Tpo -c -o src/core/gource_tests-display.obj `if test -f 'src/core/display.cpp'; then $(CYGPATH_W) 'src/core/display.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/display.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-display.Tpo src/core/$(DEPDIR)/gource_tests-display.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/display.cpp' object='src/core/gource_tests-display.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-display.obj `if test -f 'src/core/display.cpp'; then $(CYGPATH_W) 'src/core/display.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/display.cpp'; fi` src/core/gource_tests-frustum.o: src/core/frustum.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-frustum.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-frustum.Tpo -c -o src/core/gource_tests-frustum.o `test -f 'src/core/frustum.cpp' || echo '$(srcdir)/'`src/core/frustum.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-frustum.Tpo src/core/$(DEPDIR)/gource_tests-frustum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/frustum.cpp' object='src/core/gource_tests-frustum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-frustum.o `test -f 'src/core/frustum.cpp' || echo '$(srcdir)/'`src/core/frustum.cpp src/core/gource_tests-frustum.obj: src/core/frustum.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-frustum.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-frustum.Tpo -c -o src/core/gource_tests-frustum.obj `if test -f 'src/core/frustum.cpp'; then $(CYGPATH_W) 'src/core/frustum.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/frustum.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-frustum.Tpo src/core/$(DEPDIR)/gource_tests-frustum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/frustum.cpp' object='src/core/gource_tests-frustum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-frustum.obj `if test -f 'src/core/frustum.cpp'; then $(CYGPATH_W) 'src/core/frustum.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/frustum.cpp'; fi` src/core/gource_tests-fxfont.o: src/core/fxfont.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-fxfont.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-fxfont.Tpo -c -o src/core/gource_tests-fxfont.o `test -f 'src/core/fxfont.cpp' || echo '$(srcdir)/'`src/core/fxfont.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-fxfont.Tpo src/core/$(DEPDIR)/gource_tests-fxfont.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/fxfont.cpp' object='src/core/gource_tests-fxfont.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-fxfont.o `test -f 'src/core/fxfont.cpp' || echo '$(srcdir)/'`src/core/fxfont.cpp src/core/gource_tests-fxfont.obj: src/core/fxfont.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-fxfont.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-fxfont.Tpo -c -o src/core/gource_tests-fxfont.obj `if test -f 'src/core/fxfont.cpp'; then $(CYGPATH_W) 'src/core/fxfont.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/fxfont.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-fxfont.Tpo src/core/$(DEPDIR)/gource_tests-fxfont.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/fxfont.cpp' object='src/core/gource_tests-fxfont.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-fxfont.obj `if test -f 'src/core/fxfont.cpp'; then $(CYGPATH_W) 'src/core/fxfont.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/fxfont.cpp'; fi` src/core/gource_tests-logger.o: src/core/logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-logger.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-logger.Tpo -c -o src/core/gource_tests-logger.o `test -f 'src/core/logger.cpp' || echo '$(srcdir)/'`src/core/logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-logger.Tpo src/core/$(DEPDIR)/gource_tests-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/logger.cpp' object='src/core/gource_tests-logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-logger.o `test -f 'src/core/logger.cpp' || echo '$(srcdir)/'`src/core/logger.cpp src/core/gource_tests-logger.obj: src/core/logger.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-logger.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-logger.Tpo -c -o src/core/gource_tests-logger.obj `if test -f 'src/core/logger.cpp'; then $(CYGPATH_W) 'src/core/logger.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/logger.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-logger.Tpo src/core/$(DEPDIR)/gource_tests-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/logger.cpp' object='src/core/gource_tests-logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-logger.obj `if test -f 'src/core/logger.cpp'; then $(CYGPATH_W) 'src/core/logger.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/logger.cpp'; fi` src/core/gource_tests-mousecursor.o: src/core/mousecursor.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-mousecursor.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-mousecursor.Tpo -c -o src/core/gource_tests-mousecursor.o `test -f 'src/core/mousecursor.cpp' || echo '$(srcdir)/'`src/core/mousecursor.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-mousecursor.Tpo src/core/$(DEPDIR)/gource_tests-mousecursor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/mousecursor.cpp' object='src/core/gource_tests-mousecursor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-mousecursor.o `test -f 'src/core/mousecursor.cpp' || echo '$(srcdir)/'`src/core/mousecursor.cpp src/core/gource_tests-mousecursor.obj: src/core/mousecursor.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-mousecursor.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-mousecursor.Tpo -c -o src/core/gource_tests-mousecursor.obj `if test -f 'src/core/mousecursor.cpp'; then $(CYGPATH_W) 'src/core/mousecursor.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/mousecursor.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-mousecursor.Tpo src/core/$(DEPDIR)/gource_tests-mousecursor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/mousecursor.cpp' object='src/core/gource_tests-mousecursor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-mousecursor.obj `if test -f 'src/core/mousecursor.cpp'; then $(CYGPATH_W) 'src/core/mousecursor.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/mousecursor.cpp'; fi` src/core/gource_tests-plane.o: src/core/plane.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-plane.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-plane.Tpo -c -o src/core/gource_tests-plane.o `test -f 'src/core/plane.cpp' || echo '$(srcdir)/'`src/core/plane.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-plane.Tpo src/core/$(DEPDIR)/gource_tests-plane.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/plane.cpp' object='src/core/gource_tests-plane.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-plane.o `test -f 'src/core/plane.cpp' || echo '$(srcdir)/'`src/core/plane.cpp src/core/gource_tests-plane.obj: src/core/plane.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-plane.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-plane.Tpo -c -o src/core/gource_tests-plane.obj `if test -f 'src/core/plane.cpp'; then $(CYGPATH_W) 'src/core/plane.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/plane.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-plane.Tpo src/core/$(DEPDIR)/gource_tests-plane.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/plane.cpp' object='src/core/gource_tests-plane.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-plane.obj `if test -f 'src/core/plane.cpp'; then $(CYGPATH_W) 'src/core/plane.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/plane.cpp'; fi` src/core/gource_tests-ppm.o: src/core/ppm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-ppm.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-ppm.Tpo -c -o src/core/gource_tests-ppm.o `test -f 'src/core/ppm.cpp' || echo '$(srcdir)/'`src/core/ppm.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-ppm.Tpo src/core/$(DEPDIR)/gource_tests-ppm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/ppm.cpp' object='src/core/gource_tests-ppm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-ppm.o `test -f 'src/core/ppm.cpp' || echo '$(srcdir)/'`src/core/ppm.cpp src/core/gource_tests-ppm.obj: src/core/ppm.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-ppm.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-ppm.Tpo -c -o src/core/gource_tests-ppm.obj `if test -f 'src/core/ppm.cpp'; then $(CYGPATH_W) 'src/core/ppm.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/ppm.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-ppm.Tpo src/core/$(DEPDIR)/gource_tests-ppm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/ppm.cpp' object='src/core/gource_tests-ppm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-ppm.obj `if test -f 'src/core/ppm.cpp'; then $(CYGPATH_W) 'src/core/ppm.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/ppm.cpp'; fi` src/core/gource_tests-quadtree.o: src/core/quadtree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-quadtree.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-quadtree.Tpo -c -o src/core/gource_tests-quadtree.o `test -f 'src/core/quadtree.cpp' || echo '$(srcdir)/'`src/core/quadtree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-quadtree.Tpo src/core/$(DEPDIR)/gource_tests-quadtree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/quadtree.cpp' object='src/core/gource_tests-quadtree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-quadtree.o `test -f 'src/core/quadtree.cpp' || echo '$(srcdir)/'`src/core/quadtree.cpp src/core/gource_tests-quadtree.obj: src/core/quadtree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-quadtree.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-quadtree.Tpo -c -o src/core/gource_tests-quadtree.obj `if test -f 'src/core/quadtree.cpp'; then $(CYGPATH_W) 'src/core/quadtree.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/quadtree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-quadtree.Tpo src/core/$(DEPDIR)/gource_tests-quadtree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/quadtree.cpp' object='src/core/gource_tests-quadtree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-quadtree.obj `if test -f 'src/core/quadtree.cpp'; then $(CYGPATH_W) 'src/core/quadtree.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/quadtree.cpp'; fi` src/core/gource_tests-regex.o: src/core/regex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-regex.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-regex.Tpo -c -o src/core/gource_tests-regex.o `test -f 'src/core/regex.cpp' || echo '$(srcdir)/'`src/core/regex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-regex.Tpo src/core/$(DEPDIR)/gource_tests-regex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/regex.cpp' object='src/core/gource_tests-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-regex.o `test -f 'src/core/regex.cpp' || echo '$(srcdir)/'`src/core/regex.cpp src/core/gource_tests-regex.obj: src/core/regex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-regex.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-regex.Tpo -c -o src/core/gource_tests-regex.obj `if test -f 'src/core/regex.cpp'; then $(CYGPATH_W) 'src/core/regex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/regex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-regex.Tpo src/core/$(DEPDIR)/gource_tests-regex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/regex.cpp' object='src/core/gource_tests-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-regex.obj `if test -f 'src/core/regex.cpp'; then $(CYGPATH_W) 'src/core/regex.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/regex.cpp'; fi` src/core/gource_tests-resource.o: src/core/resource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-resource.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-resource.Tpo -c -o src/core/gource_tests-resource.o `test -f 'src/core/resource.cpp' || echo '$(srcdir)/'`src/core/resource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-resource.Tpo src/core/$(DEPDIR)/gource_tests-resource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/resource.cpp' object='src/core/gource_tests-resource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-resource.o `test -f 'src/core/resource.cpp' || echo '$(srcdir)/'`src/core/resource.cpp src/core/gource_tests-resource.obj: src/core/resource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-resource.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-resource.Tpo -c -o src/core/gource_tests-resource.obj `if test -f 'src/core/resource.cpp'; then $(CYGPATH_W) 'src/core/resource.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/resource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-resource.Tpo src/core/$(DEPDIR)/gource_tests-resource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/resource.cpp' object='src/core/gource_tests-resource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-resource.obj `if test -f 'src/core/resource.cpp'; then $(CYGPATH_W) 'src/core/resource.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/resource.cpp'; fi` src/core/gource_tests-sdlapp.o: src/core/sdlapp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-sdlapp.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-sdlapp.Tpo -c -o src/core/gource_tests-sdlapp.o `test -f 'src/core/sdlapp.cpp' || echo '$(srcdir)/'`src/core/sdlapp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-sdlapp.Tpo src/core/$(DEPDIR)/gource_tests-sdlapp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/sdlapp.cpp' object='src/core/gource_tests-sdlapp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-sdlapp.o `test -f 'src/core/sdlapp.cpp' || echo '$(srcdir)/'`src/core/sdlapp.cpp src/core/gource_tests-sdlapp.obj: src/core/sdlapp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-sdlapp.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-sdlapp.Tpo -c -o src/core/gource_tests-sdlapp.obj `if test -f 'src/core/sdlapp.cpp'; then $(CYGPATH_W) 'src/core/sdlapp.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/sdlapp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-sdlapp.Tpo src/core/$(DEPDIR)/gource_tests-sdlapp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/sdlapp.cpp' object='src/core/gource_tests-sdlapp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-sdlapp.obj `if test -f 'src/core/sdlapp.cpp'; then $(CYGPATH_W) 'src/core/sdlapp.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/sdlapp.cpp'; fi` src/core/gource_tests-seeklog.o: src/core/seeklog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-seeklog.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-seeklog.Tpo -c -o src/core/gource_tests-seeklog.o `test -f 'src/core/seeklog.cpp' || echo '$(srcdir)/'`src/core/seeklog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-seeklog.Tpo src/core/$(DEPDIR)/gource_tests-seeklog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/seeklog.cpp' object='src/core/gource_tests-seeklog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-seeklog.o `test -f 'src/core/seeklog.cpp' || echo '$(srcdir)/'`src/core/seeklog.cpp src/core/gource_tests-seeklog.obj: src/core/seeklog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-seeklog.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-seeklog.Tpo -c -o src/core/gource_tests-seeklog.obj `if test -f 'src/core/seeklog.cpp'; then $(CYGPATH_W) 'src/core/seeklog.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/seeklog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-seeklog.Tpo src/core/$(DEPDIR)/gource_tests-seeklog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/seeklog.cpp' object='src/core/gource_tests-seeklog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-seeklog.obj `if test -f 'src/core/seeklog.cpp'; then $(CYGPATH_W) 'src/core/seeklog.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/seeklog.cpp'; fi` src/core/gource_tests-settings.o: src/core/settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-settings.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-settings.Tpo -c -o src/core/gource_tests-settings.o `test -f 'src/core/settings.cpp' || echo '$(srcdir)/'`src/core/settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-settings.Tpo src/core/$(DEPDIR)/gource_tests-settings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/settings.cpp' object='src/core/gource_tests-settings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-settings.o `test -f 'src/core/settings.cpp' || echo '$(srcdir)/'`src/core/settings.cpp src/core/gource_tests-settings.obj: src/core/settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-settings.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-settings.Tpo -c -o src/core/gource_tests-settings.obj `if test -f 'src/core/settings.cpp'; then $(CYGPATH_W) 'src/core/settings.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/settings.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-settings.Tpo src/core/$(DEPDIR)/gource_tests-settings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/settings.cpp' object='src/core/gource_tests-settings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-settings.obj `if test -f 'src/core/settings.cpp'; then $(CYGPATH_W) 'src/core/settings.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/settings.cpp'; fi` src/core/gource_tests-shader.o: src/core/shader.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-shader.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-shader.Tpo -c -o src/core/gource_tests-shader.o `test -f 'src/core/shader.cpp' || echo '$(srcdir)/'`src/core/shader.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-shader.Tpo src/core/$(DEPDIR)/gource_tests-shader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/shader.cpp' object='src/core/gource_tests-shader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-shader.o `test -f 'src/core/shader.cpp' || echo '$(srcdir)/'`src/core/shader.cpp src/core/gource_tests-shader.obj: src/core/shader.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-shader.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-shader.Tpo -c -o src/core/gource_tests-shader.obj `if test -f 'src/core/shader.cpp'; then $(CYGPATH_W) 'src/core/shader.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/shader.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-shader.Tpo src/core/$(DEPDIR)/gource_tests-shader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/shader.cpp' object='src/core/gource_tests-shader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-shader.obj `if test -f 'src/core/shader.cpp'; then $(CYGPATH_W) 'src/core/shader.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/shader.cpp'; fi` src/core/gource_tests-shader_common.o: src/core/shader_common.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-shader_common.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-shader_common.Tpo -c -o src/core/gource_tests-shader_common.o `test -f 'src/core/shader_common.cpp' || echo '$(srcdir)/'`src/core/shader_common.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-shader_common.Tpo src/core/$(DEPDIR)/gource_tests-shader_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/shader_common.cpp' object='src/core/gource_tests-shader_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-shader_common.o `test -f 'src/core/shader_common.cpp' || echo '$(srcdir)/'`src/core/shader_common.cpp src/core/gource_tests-shader_common.obj: src/core/shader_common.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-shader_common.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-shader_common.Tpo -c -o src/core/gource_tests-shader_common.obj `if test -f 'src/core/shader_common.cpp'; then $(CYGPATH_W) 'src/core/shader_common.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/shader_common.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-shader_common.Tpo src/core/$(DEPDIR)/gource_tests-shader_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/shader_common.cpp' object='src/core/gource_tests-shader_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-shader_common.obj `if test -f 'src/core/shader_common.cpp'; then $(CYGPATH_W) 'src/core/shader_common.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/shader_common.cpp'; fi` src/core/gource_tests-stringhash.o: src/core/stringhash.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-stringhash.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-stringhash.Tpo -c -o src/core/gource_tests-stringhash.o `test -f 'src/core/stringhash.cpp' || echo '$(srcdir)/'`src/core/stringhash.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-stringhash.Tpo src/core/$(DEPDIR)/gource_tests-stringhash.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/stringhash.cpp' object='src/core/gource_tests-stringhash.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-stringhash.o `test -f 'src/core/stringhash.cpp' || echo '$(srcdir)/'`src/core/stringhash.cpp src/core/gource_tests-stringhash.obj: src/core/stringhash.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-stringhash.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-stringhash.Tpo -c -o src/core/gource_tests-stringhash.obj `if test -f 'src/core/stringhash.cpp'; then $(CYGPATH_W) 'src/core/stringhash.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/stringhash.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-stringhash.Tpo src/core/$(DEPDIR)/gource_tests-stringhash.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/stringhash.cpp' object='src/core/gource_tests-stringhash.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-stringhash.obj `if test -f 'src/core/stringhash.cpp'; then $(CYGPATH_W) 'src/core/stringhash.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/stringhash.cpp'; fi` src/core/gource_tests-texture.o: src/core/texture.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-texture.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-texture.Tpo -c -o src/core/gource_tests-texture.o `test -f 'src/core/texture.cpp' || echo '$(srcdir)/'`src/core/texture.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-texture.Tpo src/core/$(DEPDIR)/gource_tests-texture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/texture.cpp' object='src/core/gource_tests-texture.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-texture.o `test -f 'src/core/texture.cpp' || echo '$(srcdir)/'`src/core/texture.cpp src/core/gource_tests-texture.obj: src/core/texture.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-texture.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-texture.Tpo -c -o src/core/gource_tests-texture.obj `if test -f 'src/core/texture.cpp'; then $(CYGPATH_W) 'src/core/texture.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/texture.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-texture.Tpo src/core/$(DEPDIR)/gource_tests-texture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/texture.cpp' object='src/core/gource_tests-texture.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-texture.obj `if test -f 'src/core/texture.cpp'; then $(CYGPATH_W) 'src/core/texture.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/texture.cpp'; fi` src/core/gource_tests-png_writer.o: src/core/png_writer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-png_writer.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-png_writer.Tpo -c -o src/core/gource_tests-png_writer.o `test -f 'src/core/png_writer.cpp' || echo '$(srcdir)/'`src/core/png_writer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-png_writer.Tpo src/core/$(DEPDIR)/gource_tests-png_writer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/png_writer.cpp' object='src/core/gource_tests-png_writer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-png_writer.o `test -f 'src/core/png_writer.cpp' || echo '$(srcdir)/'`src/core/png_writer.cpp src/core/gource_tests-png_writer.obj: src/core/png_writer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-png_writer.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-png_writer.Tpo -c -o src/core/gource_tests-png_writer.obj `if test -f 'src/core/png_writer.cpp'; then $(CYGPATH_W) 'src/core/png_writer.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/png_writer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-png_writer.Tpo src/core/$(DEPDIR)/gource_tests-png_writer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/png_writer.cpp' object='src/core/gource_tests-png_writer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-png_writer.obj `if test -f 'src/core/png_writer.cpp'; then $(CYGPATH_W) 'src/core/png_writer.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/png_writer.cpp'; fi` src/core/gource_tests-timezone.o: src/core/timezone.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-timezone.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-timezone.Tpo -c -o src/core/gource_tests-timezone.o `test -f 'src/core/timezone.cpp' || echo '$(srcdir)/'`src/core/timezone.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-timezone.Tpo src/core/$(DEPDIR)/gource_tests-timezone.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/timezone.cpp' object='src/core/gource_tests-timezone.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-timezone.o `test -f 'src/core/timezone.cpp' || echo '$(srcdir)/'`src/core/timezone.cpp src/core/gource_tests-timezone.obj: src/core/timezone.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-timezone.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-timezone.Tpo -c -o src/core/gource_tests-timezone.obj `if test -f 'src/core/timezone.cpp'; then $(CYGPATH_W) 'src/core/timezone.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/timezone.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-timezone.Tpo src/core/$(DEPDIR)/gource_tests-timezone.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/timezone.cpp' object='src/core/gource_tests-timezone.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-timezone.obj `if test -f 'src/core/timezone.cpp'; then $(CYGPATH_W) 'src/core/timezone.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/timezone.cpp'; fi` src/core/gource_tests-vbo.o: src/core/vbo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-vbo.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-vbo.Tpo -c -o src/core/gource_tests-vbo.o `test -f 'src/core/vbo.cpp' || echo '$(srcdir)/'`src/core/vbo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-vbo.Tpo src/core/$(DEPDIR)/gource_tests-vbo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/vbo.cpp' object='src/core/gource_tests-vbo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-vbo.o `test -f 'src/core/vbo.cpp' || echo '$(srcdir)/'`src/core/vbo.cpp src/core/gource_tests-vbo.obj: src/core/vbo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-vbo.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-vbo.Tpo -c -o src/core/gource_tests-vbo.obj `if test -f 'src/core/vbo.cpp'; then $(CYGPATH_W) 'src/core/vbo.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/vbo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-vbo.Tpo src/core/$(DEPDIR)/gource_tests-vbo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/vbo.cpp' object='src/core/gource_tests-vbo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-vbo.obj `if test -f 'src/core/vbo.cpp'; then $(CYGPATH_W) 'src/core/vbo.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/vbo.cpp'; fi` src/core/gource_tests-vectors.o: src/core/vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-vectors.o -MD -MP -MF src/core/$(DEPDIR)/gource_tests-vectors.Tpo -c -o src/core/gource_tests-vectors.o `test -f 'src/core/vectors.cpp' || echo '$(srcdir)/'`src/core/vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-vectors.Tpo src/core/$(DEPDIR)/gource_tests-vectors.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/vectors.cpp' object='src/core/gource_tests-vectors.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-vectors.o `test -f 'src/core/vectors.cpp' || echo '$(srcdir)/'`src/core/vectors.cpp src/core/gource_tests-vectors.obj: src/core/vectors.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/core/gource_tests-vectors.obj -MD -MP -MF src/core/$(DEPDIR)/gource_tests-vectors.Tpo -c -o src/core/gource_tests-vectors.obj `if test -f 'src/core/vectors.cpp'; then $(CYGPATH_W) 'src/core/vectors.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/vectors.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/core/$(DEPDIR)/gource_tests-vectors.Tpo src/core/$(DEPDIR)/gource_tests-vectors.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/core/vectors.cpp' object='src/core/gource_tests-vectors.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/core/gource_tests-vectors.obj `if test -f 'src/core/vectors.cpp'; then $(CYGPATH_W) 'src/core/vectors.cpp'; else $(CYGPATH_W) '$(srcdir)/src/core/vectors.cpp'; fi` src/gource_tests-dirnode.o: src/dirnode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-dirnode.o -MD -MP -MF src/$(DEPDIR)/gource_tests-dirnode.Tpo -c -o src/gource_tests-dirnode.o `test -f 'src/dirnode.cpp' || echo '$(srcdir)/'`src/dirnode.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-dirnode.Tpo src/$(DEPDIR)/gource_tests-dirnode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/dirnode.cpp' object='src/gource_tests-dirnode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-dirnode.o `test -f 'src/dirnode.cpp' || echo '$(srcdir)/'`src/dirnode.cpp src/gource_tests-dirnode.obj: src/dirnode.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-dirnode.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-dirnode.Tpo -c -o src/gource_tests-dirnode.obj `if test -f 'src/dirnode.cpp'; then $(CYGPATH_W) 'src/dirnode.cpp'; else $(CYGPATH_W) '$(srcdir)/src/dirnode.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-dirnode.Tpo src/$(DEPDIR)/gource_tests-dirnode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/dirnode.cpp' object='src/gource_tests-dirnode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-dirnode.obj `if test -f 'src/dirnode.cpp'; then $(CYGPATH_W) 'src/dirnode.cpp'; else $(CYGPATH_W) '$(srcdir)/src/dirnode.cpp'; fi` src/gource_tests-file.o: src/file.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-file.o -MD -MP -MF src/$(DEPDIR)/gource_tests-file.Tpo -c -o src/gource_tests-file.o `test -f 'src/file.cpp' || echo '$(srcdir)/'`src/file.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-file.Tpo src/$(DEPDIR)/gource_tests-file.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/file.cpp' object='src/gource_tests-file.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-file.o `test -f 'src/file.cpp' || echo '$(srcdir)/'`src/file.cpp src/gource_tests-file.obj: src/file.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-file.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-file.Tpo -c -o src/gource_tests-file.obj `if test -f 'src/file.cpp'; then $(CYGPATH_W) 'src/file.cpp'; else $(CYGPATH_W) '$(srcdir)/src/file.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-file.Tpo src/$(DEPDIR)/gource_tests-file.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/file.cpp' object='src/gource_tests-file.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-file.obj `if test -f 'src/file.cpp'; then $(CYGPATH_W) 'src/file.cpp'; else $(CYGPATH_W) '$(srcdir)/src/file.cpp'; fi` src/formats/gource_tests-apache.o: src/formats/apache.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-apache.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-apache.Tpo -c -o src/formats/gource_tests-apache.o `test -f 'src/formats/apache.cpp' || echo '$(srcdir)/'`src/formats/apache.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-apache.Tpo src/formats/$(DEPDIR)/gource_tests-apache.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/apache.cpp' object='src/formats/gource_tests-apache.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-apache.o `test -f 'src/formats/apache.cpp' || echo '$(srcdir)/'`src/formats/apache.cpp src/formats/gource_tests-apache.obj: src/formats/apache.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-apache.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-apache.Tpo -c -o src/formats/gource_tests-apache.obj `if test -f 'src/formats/apache.cpp'; then $(CYGPATH_W) 'src/formats/apache.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/apache.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-apache.Tpo src/formats/$(DEPDIR)/gource_tests-apache.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/apache.cpp' object='src/formats/gource_tests-apache.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-apache.obj `if test -f 'src/formats/apache.cpp'; then $(CYGPATH_W) 'src/formats/apache.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/apache.cpp'; fi` src/formats/gource_tests-bzr.o: src/formats/bzr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-bzr.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-bzr.Tpo -c -o src/formats/gource_tests-bzr.o `test -f 'src/formats/bzr.cpp' || echo '$(srcdir)/'`src/formats/bzr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-bzr.Tpo src/formats/$(DEPDIR)/gource_tests-bzr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/bzr.cpp' object='src/formats/gource_tests-bzr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-bzr.o `test -f 'src/formats/bzr.cpp' || echo '$(srcdir)/'`src/formats/bzr.cpp src/formats/gource_tests-bzr.obj: src/formats/bzr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-bzr.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-bzr.Tpo -c -o src/formats/gource_tests-bzr.obj `if test -f 'src/formats/bzr.cpp'; then $(CYGPATH_W) 'src/formats/bzr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/bzr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-bzr.Tpo src/formats/$(DEPDIR)/gource_tests-bzr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/bzr.cpp' object='src/formats/gource_tests-bzr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-bzr.obj `if test -f 'src/formats/bzr.cpp'; then $(CYGPATH_W) 'src/formats/bzr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/bzr.cpp'; fi` src/formats/gource_tests-commitlog.o: src/formats/commitlog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-commitlog.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-commitlog.Tpo -c -o src/formats/gource_tests-commitlog.o `test -f 'src/formats/commitlog.cpp' || echo '$(srcdir)/'`src/formats/commitlog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-commitlog.Tpo src/formats/$(DEPDIR)/gource_tests-commitlog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/commitlog.cpp' object='src/formats/gource_tests-commitlog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-commitlog.o `test -f 'src/formats/commitlog.cpp' || echo '$(srcdir)/'`src/formats/commitlog.cpp src/formats/gource_tests-commitlog.obj: src/formats/commitlog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-commitlog.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-commitlog.Tpo -c -o src/formats/gource_tests-commitlog.obj `if test -f 'src/formats/commitlog.cpp'; then $(CYGPATH_W) 'src/formats/commitlog.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/commitlog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-commitlog.Tpo src/formats/$(DEPDIR)/gource_tests-commitlog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/commitlog.cpp' object='src/formats/gource_tests-commitlog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-commitlog.obj `if test -f 'src/formats/commitlog.cpp'; then $(CYGPATH_W) 'src/formats/commitlog.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/commitlog.cpp'; fi` src/formats/gource_tests-custom.o: src/formats/custom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-custom.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-custom.Tpo -c -o src/formats/gource_tests-custom.o `test -f 'src/formats/custom.cpp' || echo '$(srcdir)/'`src/formats/custom.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-custom.Tpo src/formats/$(DEPDIR)/gource_tests-custom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/custom.cpp' object='src/formats/gource_tests-custom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-custom.o `test -f 'src/formats/custom.cpp' || echo '$(srcdir)/'`src/formats/custom.cpp src/formats/gource_tests-custom.obj: src/formats/custom.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-custom.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-custom.Tpo -c -o src/formats/gource_tests-custom.obj `if test -f 'src/formats/custom.cpp'; then $(CYGPATH_W) 'src/formats/custom.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/custom.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-custom.Tpo src/formats/$(DEPDIR)/gource_tests-custom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/custom.cpp' object='src/formats/gource_tests-custom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-custom.obj `if test -f 'src/formats/custom.cpp'; then $(CYGPATH_W) 'src/formats/custom.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/custom.cpp'; fi` src/formats/gource_tests-cvs-exp.o: src/formats/cvs-exp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-cvs-exp.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-cvs-exp.Tpo -c -o src/formats/gource_tests-cvs-exp.o `test -f 'src/formats/cvs-exp.cpp' || echo '$(srcdir)/'`src/formats/cvs-exp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-cvs-exp.Tpo src/formats/$(DEPDIR)/gource_tests-cvs-exp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/cvs-exp.cpp' object='src/formats/gource_tests-cvs-exp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-cvs-exp.o `test -f 'src/formats/cvs-exp.cpp' || echo '$(srcdir)/'`src/formats/cvs-exp.cpp src/formats/gource_tests-cvs-exp.obj: src/formats/cvs-exp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-cvs-exp.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-cvs-exp.Tpo -c -o src/formats/gource_tests-cvs-exp.obj `if test -f 'src/formats/cvs-exp.cpp'; then $(CYGPATH_W) 'src/formats/cvs-exp.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/cvs-exp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-cvs-exp.Tpo src/formats/$(DEPDIR)/gource_tests-cvs-exp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/cvs-exp.cpp' object='src/formats/gource_tests-cvs-exp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-cvs-exp.obj `if test -f 'src/formats/cvs-exp.cpp'; then $(CYGPATH_W) 'src/formats/cvs-exp.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/cvs-exp.cpp'; fi` src/formats/gource_tests-cvs2cl.o: src/formats/cvs2cl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-cvs2cl.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-cvs2cl.Tpo -c -o src/formats/gource_tests-cvs2cl.o `test -f 'src/formats/cvs2cl.cpp' || echo '$(srcdir)/'`src/formats/cvs2cl.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-cvs2cl.Tpo src/formats/$(DEPDIR)/gource_tests-cvs2cl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/cvs2cl.cpp' object='src/formats/gource_tests-cvs2cl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-cvs2cl.o `test -f 'src/formats/cvs2cl.cpp' || echo '$(srcdir)/'`src/formats/cvs2cl.cpp src/formats/gource_tests-cvs2cl.obj: src/formats/cvs2cl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-cvs2cl.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-cvs2cl.Tpo -c -o src/formats/gource_tests-cvs2cl.obj `if test -f 'src/formats/cvs2cl.cpp'; then $(CYGPATH_W) 'src/formats/cvs2cl.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/cvs2cl.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-cvs2cl.Tpo src/formats/$(DEPDIR)/gource_tests-cvs2cl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/cvs2cl.cpp' object='src/formats/gource_tests-cvs2cl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-cvs2cl.obj `if test -f 'src/formats/cvs2cl.cpp'; then $(CYGPATH_W) 'src/formats/cvs2cl.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/cvs2cl.cpp'; fi` src/formats/gource_tests-git.o: src/formats/git.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-git.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-git.Tpo -c -o src/formats/gource_tests-git.o `test -f 'src/formats/git.cpp' || echo '$(srcdir)/'`src/formats/git.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-git.Tpo src/formats/$(DEPDIR)/gource_tests-git.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/git.cpp' object='src/formats/gource_tests-git.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-git.o `test -f 'src/formats/git.cpp' || echo '$(srcdir)/'`src/formats/git.cpp src/formats/gource_tests-git.obj: src/formats/git.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-git.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-git.Tpo -c -o src/formats/gource_tests-git.obj `if test -f 'src/formats/git.cpp'; then $(CYGPATH_W) 'src/formats/git.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/git.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-git.Tpo src/formats/$(DEPDIR)/gource_tests-git.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/git.cpp' object='src/formats/gource_tests-git.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-git.obj `if test -f 'src/formats/git.cpp'; then $(CYGPATH_W) 'src/formats/git.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/git.cpp'; fi` src/formats/gource_tests-gitraw.o: src/formats/gitraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-gitraw.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-gitraw.Tpo -c -o src/formats/gource_tests-gitraw.o `test -f 'src/formats/gitraw.cpp' || echo '$(srcdir)/'`src/formats/gitraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-gitraw.Tpo src/formats/$(DEPDIR)/gource_tests-gitraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/gitraw.cpp' object='src/formats/gource_tests-gitraw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-gitraw.o `test -f 'src/formats/gitraw.cpp' || echo '$(srcdir)/'`src/formats/gitraw.cpp src/formats/gource_tests-gitraw.obj: src/formats/gitraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-gitraw.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-gitraw.Tpo -c -o src/formats/gource_tests-gitraw.obj `if test -f 'src/formats/gitraw.cpp'; then $(CYGPATH_W) 'src/formats/gitraw.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/gitraw.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-gitraw.Tpo src/formats/$(DEPDIR)/gource_tests-gitraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/gitraw.cpp' object='src/formats/gource_tests-gitraw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-gitraw.obj `if test -f 'src/formats/gitraw.cpp'; then $(CYGPATH_W) 'src/formats/gitraw.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/gitraw.cpp'; fi` src/formats/gource_tests-hg.o: src/formats/hg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-hg.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-hg.Tpo -c -o src/formats/gource_tests-hg.o `test -f 'src/formats/hg.cpp' || echo '$(srcdir)/'`src/formats/hg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-hg.Tpo src/formats/$(DEPDIR)/gource_tests-hg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/hg.cpp' object='src/formats/gource_tests-hg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-hg.o `test -f 'src/formats/hg.cpp' || echo '$(srcdir)/'`src/formats/hg.cpp src/formats/gource_tests-hg.obj: src/formats/hg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-hg.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-hg.Tpo -c -o src/formats/gource_tests-hg.obj `if test -f 'src/formats/hg.cpp'; then $(CYGPATH_W) 'src/formats/hg.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/hg.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-hg.Tpo src/formats/$(DEPDIR)/gource_tests-hg.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/hg.cpp' object='src/formats/gource_tests-hg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-hg.obj `if test -f 'src/formats/hg.cpp'; then $(CYGPATH_W) 'src/formats/hg.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/hg.cpp'; fi` src/formats/gource_tests-svn.o: src/formats/svn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-svn.o -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-svn.Tpo -c -o src/formats/gource_tests-svn.o `test -f 'src/formats/svn.cpp' || echo '$(srcdir)/'`src/formats/svn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-svn.Tpo src/formats/$(DEPDIR)/gource_tests-svn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/svn.cpp' object='src/formats/gource_tests-svn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-svn.o `test -f 'src/formats/svn.cpp' || echo '$(srcdir)/'`src/formats/svn.cpp src/formats/gource_tests-svn.obj: src/formats/svn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/formats/gource_tests-svn.obj -MD -MP -MF src/formats/$(DEPDIR)/gource_tests-svn.Tpo -c -o src/formats/gource_tests-svn.obj `if test -f 'src/formats/svn.cpp'; then $(CYGPATH_W) 'src/formats/svn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/svn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/formats/$(DEPDIR)/gource_tests-svn.Tpo src/formats/$(DEPDIR)/gource_tests-svn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/formats/svn.cpp' object='src/formats/gource_tests-svn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/formats/gource_tests-svn.obj `if test -f 'src/formats/svn.cpp'; then $(CYGPATH_W) 'src/formats/svn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/formats/svn.cpp'; fi` src/gource_tests-gource.o: src/gource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-gource.o -MD -MP -MF src/$(DEPDIR)/gource_tests-gource.Tpo -c -o src/gource_tests-gource.o `test -f 'src/gource.cpp' || echo '$(srcdir)/'`src/gource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-gource.Tpo src/$(DEPDIR)/gource_tests-gource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource.cpp' object='src/gource_tests-gource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-gource.o `test -f 'src/gource.cpp' || echo '$(srcdir)/'`src/gource.cpp src/gource_tests-gource.obj: src/gource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-gource.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-gource.Tpo -c -o src/gource_tests-gource.obj `if test -f 'src/gource.cpp'; then $(CYGPATH_W) 'src/gource.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-gource.Tpo src/$(DEPDIR)/gource_tests-gource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource.cpp' object='src/gource_tests-gource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-gource.obj `if test -f 'src/gource.cpp'; then $(CYGPATH_W) 'src/gource.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource.cpp'; fi` src/gource_tests-gource_shell.o: src/gource_shell.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-gource_shell.o -MD -MP -MF src/$(DEPDIR)/gource_tests-gource_shell.Tpo -c -o src/gource_tests-gource_shell.o `test -f 'src/gource_shell.cpp' || echo '$(srcdir)/'`src/gource_shell.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-gource_shell.Tpo src/$(DEPDIR)/gource_tests-gource_shell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource_shell.cpp' object='src/gource_tests-gource_shell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-gource_shell.o `test -f 'src/gource_shell.cpp' || echo '$(srcdir)/'`src/gource_shell.cpp src/gource_tests-gource_shell.obj: src/gource_shell.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-gource_shell.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-gource_shell.Tpo -c -o src/gource_tests-gource_shell.obj `if test -f 'src/gource_shell.cpp'; then $(CYGPATH_W) 'src/gource_shell.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource_shell.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-gource_shell.Tpo src/$(DEPDIR)/gource_tests-gource_shell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource_shell.cpp' object='src/gource_tests-gource_shell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-gource_shell.obj `if test -f 'src/gource_shell.cpp'; then $(CYGPATH_W) 'src/gource_shell.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource_shell.cpp'; fi` src/gource_tests-gource_settings.o: src/gource_settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-gource_settings.o -MD -MP -MF src/$(DEPDIR)/gource_tests-gource_settings.Tpo -c -o src/gource_tests-gource_settings.o `test -f 'src/gource_settings.cpp' || echo '$(srcdir)/'`src/gource_settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-gource_settings.Tpo src/$(DEPDIR)/gource_tests-gource_settings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource_settings.cpp' object='src/gource_tests-gource_settings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-gource_settings.o `test -f 'src/gource_settings.cpp' || echo '$(srcdir)/'`src/gource_settings.cpp src/gource_tests-gource_settings.obj: src/gource_settings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-gource_settings.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-gource_settings.Tpo -c -o src/gource_tests-gource_settings.obj `if test -f 'src/gource_settings.cpp'; then $(CYGPATH_W) 'src/gource_settings.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource_settings.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-gource_settings.Tpo src/$(DEPDIR)/gource_tests-gource_settings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/gource_settings.cpp' object='src/gource_tests-gource_settings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-gource_settings.obj `if test -f 'src/gource_settings.cpp'; then $(CYGPATH_W) 'src/gource_settings.cpp'; else $(CYGPATH_W) '$(srcdir)/src/gource_settings.cpp'; fi` src/gource_tests-key.o: src/key.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-key.o -MD -MP -MF src/$(DEPDIR)/gource_tests-key.Tpo -c -o src/gource_tests-key.o `test -f 'src/key.cpp' || echo '$(srcdir)/'`src/key.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-key.Tpo src/$(DEPDIR)/gource_tests-key.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/key.cpp' object='src/gource_tests-key.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-key.o `test -f 'src/key.cpp' || echo '$(srcdir)/'`src/key.cpp src/gource_tests-key.obj: src/key.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-key.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-key.Tpo -c -o src/gource_tests-key.obj `if test -f 'src/key.cpp'; then $(CYGPATH_W) 'src/key.cpp'; else $(CYGPATH_W) '$(srcdir)/src/key.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-key.Tpo src/$(DEPDIR)/gource_tests-key.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/key.cpp' object='src/gource_tests-key.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-key.obj `if test -f 'src/key.cpp'; then $(CYGPATH_W) 'src/key.cpp'; else $(CYGPATH_W) '$(srcdir)/src/key.cpp'; fi` src/gource_tests-logmill.o: src/logmill.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-logmill.o -MD -MP -MF src/$(DEPDIR)/gource_tests-logmill.Tpo -c -o src/gource_tests-logmill.o `test -f 'src/logmill.cpp' || echo '$(srcdir)/'`src/logmill.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-logmill.Tpo src/$(DEPDIR)/gource_tests-logmill.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/logmill.cpp' object='src/gource_tests-logmill.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-logmill.o `test -f 'src/logmill.cpp' || echo '$(srcdir)/'`src/logmill.cpp src/gource_tests-logmill.obj: src/logmill.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-logmill.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-logmill.Tpo -c -o src/gource_tests-logmill.obj `if test -f 'src/logmill.cpp'; then $(CYGPATH_W) 'src/logmill.cpp'; else $(CYGPATH_W) '$(srcdir)/src/logmill.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-logmill.Tpo src/$(DEPDIR)/gource_tests-logmill.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/logmill.cpp' object='src/gource_tests-logmill.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-logmill.obj `if test -f 'src/logmill.cpp'; then $(CYGPATH_W) 'src/logmill.cpp'; else $(CYGPATH_W) '$(srcdir)/src/logmill.cpp'; fi` src/gource_tests-pawn.o: src/pawn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-pawn.o -MD -MP -MF src/$(DEPDIR)/gource_tests-pawn.Tpo -c -o src/gource_tests-pawn.o `test -f 'src/pawn.cpp' || echo '$(srcdir)/'`src/pawn.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-pawn.Tpo src/$(DEPDIR)/gource_tests-pawn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/pawn.cpp' object='src/gource_tests-pawn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-pawn.o `test -f 'src/pawn.cpp' || echo '$(srcdir)/'`src/pawn.cpp src/gource_tests-pawn.obj: src/pawn.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-pawn.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-pawn.Tpo -c -o src/gource_tests-pawn.obj `if test -f 'src/pawn.cpp'; then $(CYGPATH_W) 'src/pawn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/pawn.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-pawn.Tpo src/$(DEPDIR)/gource_tests-pawn.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/pawn.cpp' object='src/gource_tests-pawn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-pawn.obj `if test -f 'src/pawn.cpp'; then $(CYGPATH_W) 'src/pawn.cpp'; else $(CYGPATH_W) '$(srcdir)/src/pawn.cpp'; fi` src/gource_tests-slider.o: src/slider.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-slider.o -MD -MP -MF src/$(DEPDIR)/gource_tests-slider.Tpo -c -o src/gource_tests-slider.o `test -f 'src/slider.cpp' || echo '$(srcdir)/'`src/slider.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-slider.Tpo src/$(DEPDIR)/gource_tests-slider.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/slider.cpp' object='src/gource_tests-slider.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-slider.o `test -f 'src/slider.cpp' || echo '$(srcdir)/'`src/slider.cpp src/gource_tests-slider.obj: src/slider.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-slider.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-slider.Tpo -c -o src/gource_tests-slider.obj `if test -f 'src/slider.cpp'; then $(CYGPATH_W) 'src/slider.cpp'; else $(CYGPATH_W) '$(srcdir)/src/slider.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-slider.Tpo src/$(DEPDIR)/gource_tests-slider.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/slider.cpp' object='src/gource_tests-slider.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-slider.obj `if test -f 'src/slider.cpp'; then $(CYGPATH_W) 'src/slider.cpp'; else $(CYGPATH_W) '$(srcdir)/src/slider.cpp'; fi` src/gource_tests-spline.o: src/spline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-spline.o -MD -MP -MF src/$(DEPDIR)/gource_tests-spline.Tpo -c -o src/gource_tests-spline.o `test -f 'src/spline.cpp' || echo '$(srcdir)/'`src/spline.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-spline.Tpo src/$(DEPDIR)/gource_tests-spline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/spline.cpp' object='src/gource_tests-spline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-spline.o `test -f 'src/spline.cpp' || echo '$(srcdir)/'`src/spline.cpp src/gource_tests-spline.obj: src/spline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-spline.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-spline.Tpo -c -o src/gource_tests-spline.obj `if test -f 'src/spline.cpp'; then $(CYGPATH_W) 'src/spline.cpp'; else $(CYGPATH_W) '$(srcdir)/src/spline.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-spline.Tpo src/$(DEPDIR)/gource_tests-spline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/spline.cpp' object='src/gource_tests-spline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-spline.obj `if test -f 'src/spline.cpp'; then $(CYGPATH_W) 'src/spline.cpp'; else $(CYGPATH_W) '$(srcdir)/src/spline.cpp'; fi` src/gource_tests-textbox.o: src/textbox.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-textbox.o -MD -MP -MF src/$(DEPDIR)/gource_tests-textbox.Tpo -c -o src/gource_tests-textbox.o `test -f 'src/textbox.cpp' || echo '$(srcdir)/'`src/textbox.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-textbox.Tpo src/$(DEPDIR)/gource_tests-textbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/textbox.cpp' object='src/gource_tests-textbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-textbox.o `test -f 'src/textbox.cpp' || echo '$(srcdir)/'`src/textbox.cpp src/gource_tests-textbox.obj: src/textbox.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-textbox.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-textbox.Tpo -c -o src/gource_tests-textbox.obj `if test -f 'src/textbox.cpp'; then $(CYGPATH_W) 'src/textbox.cpp'; else $(CYGPATH_W) '$(srcdir)/src/textbox.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-textbox.Tpo src/$(DEPDIR)/gource_tests-textbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/textbox.cpp' object='src/gource_tests-textbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-textbox.obj `if test -f 'src/textbox.cpp'; then $(CYGPATH_W) 'src/textbox.cpp'; else $(CYGPATH_W) '$(srcdir)/src/textbox.cpp'; fi` src/gource_tests-user.o: src/user.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-user.o -MD -MP -MF src/$(DEPDIR)/gource_tests-user.Tpo -c -o src/gource_tests-user.o `test -f 'src/user.cpp' || echo '$(srcdir)/'`src/user.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-user.Tpo src/$(DEPDIR)/gource_tests-user.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/user.cpp' object='src/gource_tests-user.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-user.o `test -f 'src/user.cpp' || echo '$(srcdir)/'`src/user.cpp src/gource_tests-user.obj: src/user.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-user.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-user.Tpo -c -o src/gource_tests-user.obj `if test -f 'src/user.cpp'; then $(CYGPATH_W) 'src/user.cpp'; else $(CYGPATH_W) '$(srcdir)/src/user.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-user.Tpo src/$(DEPDIR)/gource_tests-user.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/user.cpp' object='src/gource_tests-user.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-user.obj `if test -f 'src/user.cpp'; then $(CYGPATH_W) 'src/user.cpp'; else $(CYGPATH_W) '$(srcdir)/src/user.cpp'; fi` src/gource_tests-zoomcamera.o: src/zoomcamera.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-zoomcamera.o -MD -MP -MF src/$(DEPDIR)/gource_tests-zoomcamera.Tpo -c -o src/gource_tests-zoomcamera.o `test -f 'src/zoomcamera.cpp' || echo '$(srcdir)/'`src/zoomcamera.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-zoomcamera.Tpo src/$(DEPDIR)/gource_tests-zoomcamera.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/zoomcamera.cpp' object='src/gource_tests-zoomcamera.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-zoomcamera.o `test -f 'src/zoomcamera.cpp' || echo '$(srcdir)/'`src/zoomcamera.cpp src/gource_tests-zoomcamera.obj: src/zoomcamera.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/gource_tests-zoomcamera.obj -MD -MP -MF src/$(DEPDIR)/gource_tests-zoomcamera.Tpo -c -o src/gource_tests-zoomcamera.obj `if test -f 'src/zoomcamera.cpp'; then $(CYGPATH_W) 'src/zoomcamera.cpp'; else $(CYGPATH_W) '$(srcdir)/src/zoomcamera.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/gource_tests-zoomcamera.Tpo src/$(DEPDIR)/gource_tests-zoomcamera.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/zoomcamera.cpp' object='src/gource_tests-zoomcamera.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/gource_tests-zoomcamera.obj `if test -f 'src/zoomcamera.cpp'; then $(CYGPATH_W) 'src/zoomcamera.cpp'; else $(CYGPATH_W) '$(srcdir)/src/zoomcamera.cpp'; fi` src/tinyxml/gource_tests-tinyxmlerror.o: src/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource_tests-tinyxmlerror.o -MD -MP -MF src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Tpo -c -o src/tinyxml/gource_tests-tinyxmlerror.o `test -f 'src/tinyxml/tinyxmlerror.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Tpo src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxmlerror.cpp' object='src/tinyxml/gource_tests-tinyxmlerror.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource_tests-tinyxmlerror.o `test -f 'src/tinyxml/tinyxmlerror.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxmlerror.cpp src/tinyxml/gource_tests-tinyxmlerror.obj: src/tinyxml/tinyxmlerror.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource_tests-tinyxmlerror.obj -MD -MP -MF src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Tpo -c -o src/tinyxml/gource_tests-tinyxmlerror.obj `if test -f 'src/tinyxml/tinyxmlerror.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxmlerror.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Tpo src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxmlerror.cpp' object='src/tinyxml/gource_tests-tinyxmlerror.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource_tests-tinyxmlerror.obj `if test -f 'src/tinyxml/tinyxmlerror.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxmlerror.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxmlerror.cpp'; fi` src/tinyxml/gource_tests-tinystr.o: src/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource_tests-tinystr.o -MD -MP -MF src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Tpo -c -o src/tinyxml/gource_tests-tinystr.o `test -f 'src/tinyxml/tinystr.cpp' || echo '$(srcdir)/'`src/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Tpo src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinystr.cpp' object='src/tinyxml/gource_tests-tinystr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource_tests-tinystr.o `test -f 'src/tinyxml/tinystr.cpp' || echo '$(srcdir)/'`src/tinyxml/tinystr.cpp src/tinyxml/gource_tests-tinystr.obj: src/tinyxml/tinystr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource_tests-tinystr.obj -MD -MP -MF src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Tpo -c -o src/tinyxml/gource_tests-tinystr.obj `if test -f 'src/tinyxml/tinystr.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinystr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Tpo src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinystr.cpp' object='src/tinyxml/gource_tests-tinystr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource_tests-tinystr.obj `if test -f 'src/tinyxml/tinystr.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinystr.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinystr.cpp'; fi` src/tinyxml/gource_tests-tinyxml.o: src/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource_tests-tinyxml.o -MD -MP -MF src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Tpo -c -o src/tinyxml/gource_tests-tinyxml.o `test -f 'src/tinyxml/tinyxml.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Tpo src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxml.cpp' object='src/tinyxml/gource_tests-tinyxml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource_tests-tinyxml.o `test -f 'src/tinyxml/tinyxml.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxml.cpp src/tinyxml/gource_tests-tinyxml.obj: src/tinyxml/tinyxml.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource_tests-tinyxml.obj -MD -MP -MF src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Tpo -c -o src/tinyxml/gource_tests-tinyxml.obj `if test -f 'src/tinyxml/tinyxml.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxml.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Tpo src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxml.cpp' object='src/tinyxml/gource_tests-tinyxml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource_tests-tinyxml.obj `if test -f 'src/tinyxml/tinyxml.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxml.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxml.cpp'; fi` src/tinyxml/gource_tests-tinyxmlparser.o: src/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource_tests-tinyxmlparser.o -MD -MP -MF src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Tpo -c -o src/tinyxml/gource_tests-tinyxmlparser.o `test -f 'src/tinyxml/tinyxmlparser.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Tpo src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxmlparser.cpp' object='src/tinyxml/gource_tests-tinyxmlparser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource_tests-tinyxmlparser.o `test -f 'src/tinyxml/tinyxmlparser.cpp' || echo '$(srcdir)/'`src/tinyxml/tinyxmlparser.cpp src/tinyxml/gource_tests-tinyxmlparser.obj: src/tinyxml/tinyxmlparser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tinyxml/gource_tests-tinyxmlparser.obj -MD -MP -MF src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Tpo -c -o src/tinyxml/gource_tests-tinyxmlparser.obj `if test -f 'src/tinyxml/tinyxmlparser.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxmlparser.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Tpo src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tinyxml/tinyxmlparser.cpp' object='src/tinyxml/gource_tests-tinyxmlparser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gource_tests_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tinyxml/gource_tests-tinyxmlparser.obj `if test -f 'src/tinyxml/tinyxmlparser.cpp'; then $(CYGPATH_W) 'src/tinyxml/tinyxmlparser.cpp'; else $(CYGPATH_W) '$(srcdir)/src/tinyxml/tinyxmlparser.cpp'; fi` install-dist_fontsDATA: $(dist_fonts_DATA) @$(NORMAL_INSTALL) @list='$(dist_fonts_DATA)'; test -n "$(fontsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(fontsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(fontsdir)" || 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)$(fontsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(fontsdir)" || exit $$?; \ done uninstall-dist_fontsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_fonts_DATA)'; test -n "$(fontsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(fontsdir)'; $(am__uninstall_files_from_dir) install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || 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)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) install-dist_shadersDATA: $(dist_shaders_DATA) @$(NORMAL_INSTALL) @list='$(dist_shaders_DATA)'; test -n "$(shadersdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(shadersdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(shadersdir)" || 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)$(shadersdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(shadersdir)" || exit $$?; \ done uninstall-dist_shadersDATA: @$(NORMAL_UNINSTALL) @list='$(dist_shaders_DATA)'; test -n "$(shadersdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(shadersdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? gource_tests.log: gource_tests$(EXEEXT) @p='gource_tests$(EXEEXT)'; \ b='gource_tests'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @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 -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(fontsdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(shadersdir)"; 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: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) 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) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) -rm -f src/core/$(DEPDIR)/$(am__dirstamp) -rm -f src/core/$(am__dirstamp) -rm -f src/formats/$(DEPDIR)/$(am__dirstamp) -rm -f src/formats/$(am__dirstamp) -rm -f src/test/$(DEPDIR)/$(am__dirstamp) -rm -f src/test/$(am__dirstamp) -rm -f src/tinyxml/$(DEPDIR)/$(am__dirstamp) -rm -f src/tinyxml/$(am__dirstamp) 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-binPROGRAMS clean-checkPROGRAMS clean-generic \ mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f src/$(DEPDIR)/gource-action.Po -rm -f src/$(DEPDIR)/gource-bloom.Po -rm -f src/$(DEPDIR)/gource-caption.Po -rm -f src/$(DEPDIR)/gource-dirnode.Po -rm -f src/$(DEPDIR)/gource-file.Po -rm -f src/$(DEPDIR)/gource-gource.Po -rm -f src/$(DEPDIR)/gource-gource_settings.Po -rm -f src/$(DEPDIR)/gource-gource_shell.Po -rm -f src/$(DEPDIR)/gource-key.Po -rm -f src/$(DEPDIR)/gource-logmill.Po -rm -f src/$(DEPDIR)/gource-main.Po -rm -f src/$(DEPDIR)/gource-pawn.Po -rm -f src/$(DEPDIR)/gource-slider.Po -rm -f src/$(DEPDIR)/gource-spline.Po -rm -f src/$(DEPDIR)/gource-textbox.Po -rm -f src/$(DEPDIR)/gource-user.Po -rm -f src/$(DEPDIR)/gource-zoomcamera.Po -rm -f src/$(DEPDIR)/gource_tests-action.Po -rm -f src/$(DEPDIR)/gource_tests-bloom.Po -rm -f src/$(DEPDIR)/gource_tests-caption.Po -rm -f src/$(DEPDIR)/gource_tests-dirnode.Po -rm -f src/$(DEPDIR)/gource_tests-file.Po -rm -f src/$(DEPDIR)/gource_tests-gource.Po -rm -f src/$(DEPDIR)/gource_tests-gource_settings.Po -rm -f src/$(DEPDIR)/gource_tests-gource_shell.Po -rm -f src/$(DEPDIR)/gource_tests-key.Po -rm -f src/$(DEPDIR)/gource_tests-logmill.Po -rm -f src/$(DEPDIR)/gource_tests-pawn.Po -rm -f src/$(DEPDIR)/gource_tests-slider.Po -rm -f src/$(DEPDIR)/gource_tests-spline.Po -rm -f src/$(DEPDIR)/gource_tests-textbox.Po -rm -f src/$(DEPDIR)/gource_tests-user.Po -rm -f src/$(DEPDIR)/gource_tests-zoomcamera.Po -rm -f src/core/$(DEPDIR)/gource-conffile.Po -rm -f src/core/$(DEPDIR)/gource-display.Po -rm -f src/core/$(DEPDIR)/gource-frustum.Po -rm -f src/core/$(DEPDIR)/gource-fxfont.Po -rm -f src/core/$(DEPDIR)/gource-logger.Po -rm -f src/core/$(DEPDIR)/gource-mousecursor.Po -rm -f src/core/$(DEPDIR)/gource-plane.Po -rm -f src/core/$(DEPDIR)/gource-png_writer.Po -rm -f src/core/$(DEPDIR)/gource-ppm.Po -rm -f src/core/$(DEPDIR)/gource-quadtree.Po -rm -f src/core/$(DEPDIR)/gource-regex.Po -rm -f src/core/$(DEPDIR)/gource-resource.Po -rm -f src/core/$(DEPDIR)/gource-sdlapp.Po -rm -f src/core/$(DEPDIR)/gource-seeklog.Po -rm -f src/core/$(DEPDIR)/gource-settings.Po -rm -f src/core/$(DEPDIR)/gource-shader.Po -rm -f src/core/$(DEPDIR)/gource-shader_common.Po -rm -f src/core/$(DEPDIR)/gource-stringhash.Po -rm -f src/core/$(DEPDIR)/gource-texture.Po -rm -f src/core/$(DEPDIR)/gource-timezone.Po -rm -f src/core/$(DEPDIR)/gource-vbo.Po -rm -f src/core/$(DEPDIR)/gource-vectors.Po -rm -f src/core/$(DEPDIR)/gource_tests-conffile.Po -rm -f src/core/$(DEPDIR)/gource_tests-display.Po -rm -f src/core/$(DEPDIR)/gource_tests-frustum.Po -rm -f src/core/$(DEPDIR)/gource_tests-fxfont.Po -rm -f src/core/$(DEPDIR)/gource_tests-logger.Po -rm -f src/core/$(DEPDIR)/gource_tests-mousecursor.Po -rm -f src/core/$(DEPDIR)/gource_tests-plane.Po -rm -f src/core/$(DEPDIR)/gource_tests-png_writer.Po -rm -f src/core/$(DEPDIR)/gource_tests-ppm.Po -rm -f src/core/$(DEPDIR)/gource_tests-quadtree.Po -rm -f src/core/$(DEPDIR)/gource_tests-regex.Po -rm -f src/core/$(DEPDIR)/gource_tests-resource.Po -rm -f src/core/$(DEPDIR)/gource_tests-sdlapp.Po -rm -f src/core/$(DEPDIR)/gource_tests-seeklog.Po -rm -f src/core/$(DEPDIR)/gource_tests-settings.Po -rm -f src/core/$(DEPDIR)/gource_tests-shader.Po -rm -f src/core/$(DEPDIR)/gource_tests-shader_common.Po -rm -f src/core/$(DEPDIR)/gource_tests-stringhash.Po -rm -f src/core/$(DEPDIR)/gource_tests-texture.Po -rm -f src/core/$(DEPDIR)/gource_tests-timezone.Po -rm -f src/core/$(DEPDIR)/gource_tests-vbo.Po -rm -f src/core/$(DEPDIR)/gource_tests-vectors.Po -rm -f src/formats/$(DEPDIR)/gource-apache.Po -rm -f src/formats/$(DEPDIR)/gource-bzr.Po -rm -f src/formats/$(DEPDIR)/gource-commitlog.Po -rm -f src/formats/$(DEPDIR)/gource-custom.Po -rm -f src/formats/$(DEPDIR)/gource-cvs-exp.Po -rm -f src/formats/$(DEPDIR)/gource-cvs2cl.Po -rm -f src/formats/$(DEPDIR)/gource-git.Po -rm -f src/formats/$(DEPDIR)/gource-gitraw.Po -rm -f src/formats/$(DEPDIR)/gource-hg.Po -rm -f src/formats/$(DEPDIR)/gource-svn.Po -rm -f src/formats/$(DEPDIR)/gource_tests-apache.Po -rm -f src/formats/$(DEPDIR)/gource_tests-bzr.Po -rm -f src/formats/$(DEPDIR)/gource_tests-commitlog.Po -rm -f src/formats/$(DEPDIR)/gource_tests-custom.Po -rm -f src/formats/$(DEPDIR)/gource_tests-cvs-exp.Po -rm -f src/formats/$(DEPDIR)/gource_tests-cvs2cl.Po -rm -f src/formats/$(DEPDIR)/gource_tests-git.Po -rm -f src/formats/$(DEPDIR)/gource_tests-gitraw.Po -rm -f src/formats/$(DEPDIR)/gource_tests-hg.Po -rm -f src/formats/$(DEPDIR)/gource_tests-svn.Po -rm -f src/test/$(DEPDIR)/gource_tests-datetime_tests.Po -rm -f src/test/$(DEPDIR)/gource_tests-main.Po -rm -f src/test/$(DEPDIR)/gource_tests-regex_tests.Po -rm -f src/tinyxml/$(DEPDIR)/gource-tinystr.Po -rm -f src/tinyxml/$(DEPDIR)/gource-tinyxml.Po -rm -f src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Po -rm -f src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Po -rm -f src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Po -rm -f src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Po -rm -f src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Po -rm -f src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_fontsDATA install-dist_pkgdataDATA \ install-dist_shadersDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS 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 $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f src/$(DEPDIR)/gource-action.Po -rm -f src/$(DEPDIR)/gource-bloom.Po -rm -f src/$(DEPDIR)/gource-caption.Po -rm -f src/$(DEPDIR)/gource-dirnode.Po -rm -f src/$(DEPDIR)/gource-file.Po -rm -f src/$(DEPDIR)/gource-gource.Po -rm -f src/$(DEPDIR)/gource-gource_settings.Po -rm -f src/$(DEPDIR)/gource-gource_shell.Po -rm -f src/$(DEPDIR)/gource-key.Po -rm -f src/$(DEPDIR)/gource-logmill.Po -rm -f src/$(DEPDIR)/gource-main.Po -rm -f src/$(DEPDIR)/gource-pawn.Po -rm -f src/$(DEPDIR)/gource-slider.Po -rm -f src/$(DEPDIR)/gource-spline.Po -rm -f src/$(DEPDIR)/gource-textbox.Po -rm -f src/$(DEPDIR)/gource-user.Po -rm -f src/$(DEPDIR)/gource-zoomcamera.Po -rm -f src/$(DEPDIR)/gource_tests-action.Po -rm -f src/$(DEPDIR)/gource_tests-bloom.Po -rm -f src/$(DEPDIR)/gource_tests-caption.Po -rm -f src/$(DEPDIR)/gource_tests-dirnode.Po -rm -f src/$(DEPDIR)/gource_tests-file.Po -rm -f src/$(DEPDIR)/gource_tests-gource.Po -rm -f src/$(DEPDIR)/gource_tests-gource_settings.Po -rm -f src/$(DEPDIR)/gource_tests-gource_shell.Po -rm -f src/$(DEPDIR)/gource_tests-key.Po -rm -f src/$(DEPDIR)/gource_tests-logmill.Po -rm -f src/$(DEPDIR)/gource_tests-pawn.Po -rm -f src/$(DEPDIR)/gource_tests-slider.Po -rm -f src/$(DEPDIR)/gource_tests-spline.Po -rm -f src/$(DEPDIR)/gource_tests-textbox.Po -rm -f src/$(DEPDIR)/gource_tests-user.Po -rm -f src/$(DEPDIR)/gource_tests-zoomcamera.Po -rm -f src/core/$(DEPDIR)/gource-conffile.Po -rm -f src/core/$(DEPDIR)/gource-display.Po -rm -f src/core/$(DEPDIR)/gource-frustum.Po -rm -f src/core/$(DEPDIR)/gource-fxfont.Po -rm -f src/core/$(DEPDIR)/gource-logger.Po -rm -f src/core/$(DEPDIR)/gource-mousecursor.Po -rm -f src/core/$(DEPDIR)/gource-plane.Po -rm -f src/core/$(DEPDIR)/gource-png_writer.Po -rm -f src/core/$(DEPDIR)/gource-ppm.Po -rm -f src/core/$(DEPDIR)/gource-quadtree.Po -rm -f src/core/$(DEPDIR)/gource-regex.Po -rm -f src/core/$(DEPDIR)/gource-resource.Po -rm -f src/core/$(DEPDIR)/gource-sdlapp.Po -rm -f src/core/$(DEPDIR)/gource-seeklog.Po -rm -f src/core/$(DEPDIR)/gource-settings.Po -rm -f src/core/$(DEPDIR)/gource-shader.Po -rm -f src/core/$(DEPDIR)/gource-shader_common.Po -rm -f src/core/$(DEPDIR)/gource-stringhash.Po -rm -f src/core/$(DEPDIR)/gource-texture.Po -rm -f src/core/$(DEPDIR)/gource-timezone.Po -rm -f src/core/$(DEPDIR)/gource-vbo.Po -rm -f src/core/$(DEPDIR)/gource-vectors.Po -rm -f src/core/$(DEPDIR)/gource_tests-conffile.Po -rm -f src/core/$(DEPDIR)/gource_tests-display.Po -rm -f src/core/$(DEPDIR)/gource_tests-frustum.Po -rm -f src/core/$(DEPDIR)/gource_tests-fxfont.Po -rm -f src/core/$(DEPDIR)/gource_tests-logger.Po -rm -f src/core/$(DEPDIR)/gource_tests-mousecursor.Po -rm -f src/core/$(DEPDIR)/gource_tests-plane.Po -rm -f src/core/$(DEPDIR)/gource_tests-png_writer.Po -rm -f src/core/$(DEPDIR)/gource_tests-ppm.Po -rm -f src/core/$(DEPDIR)/gource_tests-quadtree.Po -rm -f src/core/$(DEPDIR)/gource_tests-regex.Po -rm -f src/core/$(DEPDIR)/gource_tests-resource.Po -rm -f src/core/$(DEPDIR)/gource_tests-sdlapp.Po -rm -f src/core/$(DEPDIR)/gource_tests-seeklog.Po -rm -f src/core/$(DEPDIR)/gource_tests-settings.Po -rm -f src/core/$(DEPDIR)/gource_tests-shader.Po -rm -f src/core/$(DEPDIR)/gource_tests-shader_common.Po -rm -f src/core/$(DEPDIR)/gource_tests-stringhash.Po -rm -f src/core/$(DEPDIR)/gource_tests-texture.Po -rm -f src/core/$(DEPDIR)/gource_tests-timezone.Po -rm -f src/core/$(DEPDIR)/gource_tests-vbo.Po -rm -f src/core/$(DEPDIR)/gource_tests-vectors.Po -rm -f src/formats/$(DEPDIR)/gource-apache.Po -rm -f src/formats/$(DEPDIR)/gource-bzr.Po -rm -f src/formats/$(DEPDIR)/gource-commitlog.Po -rm -f src/formats/$(DEPDIR)/gource-custom.Po -rm -f src/formats/$(DEPDIR)/gource-cvs-exp.Po -rm -f src/formats/$(DEPDIR)/gource-cvs2cl.Po -rm -f src/formats/$(DEPDIR)/gource-git.Po -rm -f src/formats/$(DEPDIR)/gource-gitraw.Po -rm -f src/formats/$(DEPDIR)/gource-hg.Po -rm -f src/formats/$(DEPDIR)/gource-svn.Po -rm -f src/formats/$(DEPDIR)/gource_tests-apache.Po -rm -f src/formats/$(DEPDIR)/gource_tests-bzr.Po -rm -f src/formats/$(DEPDIR)/gource_tests-commitlog.Po -rm -f src/formats/$(DEPDIR)/gource_tests-custom.Po -rm -f src/formats/$(DEPDIR)/gource_tests-cvs-exp.Po -rm -f src/formats/$(DEPDIR)/gource_tests-cvs2cl.Po -rm -f src/formats/$(DEPDIR)/gource_tests-git.Po -rm -f src/formats/$(DEPDIR)/gource_tests-gitraw.Po -rm -f src/formats/$(DEPDIR)/gource_tests-hg.Po -rm -f src/formats/$(DEPDIR)/gource_tests-svn.Po -rm -f src/test/$(DEPDIR)/gource_tests-datetime_tests.Po -rm -f src/test/$(DEPDIR)/gource_tests-main.Po -rm -f src/test/$(DEPDIR)/gource_tests-regex_tests.Po -rm -f src/tinyxml/$(DEPDIR)/gource-tinystr.Po -rm -f src/tinyxml/$(DEPDIR)/gource-tinyxml.Po -rm -f src/tinyxml/$(DEPDIR)/gource-tinyxmlerror.Po -rm -f src/tinyxml/$(DEPDIR)/gource-tinyxmlparser.Po -rm -f src/tinyxml/$(DEPDIR)/gource_tests-tinystr.Po -rm -f src/tinyxml/$(DEPDIR)/gource_tests-tinyxml.Po -rm -f src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlerror.Po -rm -f src/tinyxml/$(DEPDIR)/gource_tests-tinyxmlparser.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_fontsDATA \ uninstall-dist_pkgdataDATA uninstall-dist_shadersDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: check-am install-am install-data-am install-strip uninstall-am .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ check-TESTS check-am clean clean-binPROGRAMS \ clean-checkPROGRAMS clean-cscope clean-generic cscope \ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am \ install-data-hook install-dist_fontsDATA \ install-dist_pkgdataDATA install-dist_shadersDATA 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-compile mostlyclean-generic pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-dist_fontsDATA \ uninstall-dist_pkgdataDATA uninstall-dist_shadersDATA \ uninstall-hook .PRECIOUS: Makefile install-data-hook: $(MKDIR_P) $(DESTDIR)$(mandir)/man1 gzip -cf9 $(srcdir)/data/gource.1 > $(DESTDIR)$(mandir)/man1/gource.1.gz uninstall-hook: rm -f $(DESTDIR)$(mandir)/man1/gource.1.gz # 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: gource-0.54/aclocal.m40000644002342600234260000012230614362112040014423 0ustar andrewcandrewc# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 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-2018 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.16' 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.16.1], [], [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.16.1])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-2018 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], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2018 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-2018 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-2018 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _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. # This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2018 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. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # 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 (and possibly the TAP driver). 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 # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) 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-2018 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+set}" != 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-2018 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])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2018 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 whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2018 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 ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2018 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-2018 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. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != 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_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2018 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-2018 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-2018 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-2018 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-2018 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-2018 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 m4_include([m4/ax_boost_base.m4]) m4_include([m4/ax_boost_filesystem.m4]) m4_include([m4/ax_boost_system.m4]) m4_include([m4/ax_check_gl.m4]) m4_include([m4/ax_check_glu.m4]) m4_include([m4/ax_restore_flags_with_prefix.m4]) m4_include([m4/ax_save_flags_with_prefix.m4]) m4_include([m4/pkg.m4]) gource-0.54/Makefile.am0000644002342600234260000000504314362112040014615 0ustar andrewcandrewcACLOCAL_AMFLAGS = -I m4 bin_PROGRAMS = gource gource_CXXFLAGS = -std=gnu++0x -Wall -Wno-sign-compare -Wno-reorder -Wno-unused-but-set-variable -Wno-unused-variable sources = \ src/action.cpp \ src/bloom.cpp \ src/caption.cpp \ src/core/conffile.cpp \ src/core/display.cpp \ src/core/frustum.cpp \ src/core/fxfont.cpp \ src/core/logger.cpp \ src/core/mousecursor.cpp \ src/core/plane.cpp \ src/core/ppm.cpp \ src/core/quadtree.cpp \ src/core/regex.cpp \ src/core/resource.cpp \ src/core/sdlapp.cpp \ src/core/seeklog.cpp \ src/core/settings.cpp \ src/core/shader.cpp \ src/core/shader_common.cpp \ src/core/stringhash.cpp \ src/core/texture.cpp \ src/core/png_writer.cpp \ src/core/timezone.cpp \ src/core/vbo.cpp \ src/core/vectors.cpp \ src/dirnode.cpp \ src/file.cpp \ src/formats/apache.cpp \ src/formats/bzr.cpp \ src/formats/commitlog.cpp \ src/formats/custom.cpp \ src/formats/cvs-exp.cpp \ src/formats/cvs2cl.cpp \ src/formats/git.cpp \ src/formats/gitraw.cpp \ src/formats/hg.cpp \ src/formats/svn.cpp \ src/gource.cpp \ src/gource_shell.cpp \ src/gource_settings.cpp \ src/key.cpp \ src/logmill.cpp \ src/pawn.cpp \ src/slider.cpp \ src/spline.cpp \ src/textbox.cpp \ src/user.cpp \ src/zoomcamera.cpp if USE_BUNDLED_TINYXML sources += \ src/tinyxml/tinyxmlerror.cpp \ src/tinyxml/tinystr.cpp \ src/tinyxml/tinyxml.cpp \ src/tinyxml/tinyxmlparser.cpp endif gource_SOURCES = src/main.cpp ${sources} AM_CPPFLAGS = -DSDLAPP_RESOURCE_DIR=\"$(pkgdatadir)\" dist_pkgdata_DATA = data/beam.png data/bloom.tga data/bloom_alpha.tga data/file.png data/user.png data/gource.style shadersdir = $(pkgdatadir)/shaders dist_shaders_DATA = data/shaders/shadow.vert data/shaders/shadow.frag data/shaders/bloom.vert data/shaders/bloom.frag data/shaders/text.vert data/shaders/text.frag install-data-hook: $(MKDIR_P) $(DESTDIR)$(mandir)/man1 gzip -cf9 $(srcdir)/data/gource.1 > $(DESTDIR)$(mandir)/man1/gource.1.gz uninstall-hook: rm -f $(DESTDIR)$(mandir)/man1/gource.1.gz if FONTFILE AM_CPPFLAGS += -DGOURCE_FONT_FILE=\"$(gourcefontfile)\" else if FONTDIR AM_CPPFLAGS += -DSDLAPP_FONT_DIR=\"$(gourcefontdir)\" else fontsdir = $(pkgdatadir)/fonts dist_fonts_DATA = data/fonts/README data/fonts/FreeSans.ttf endif endif check_PROGRAMS = gource_tests gource_tests_CPPFLAGS = -I src/test/ ${BOOST_CPPFLAGS} gource_tests_LDFLAGS = ${BOOST_LDFLAGS} gource_tests_LDADD = ${BOOST_UNIT_TEST_FRAMEWORK_LIB} gource_tests_SOURCES = \ src/test/main.cpp \ src/test/datetime_tests.cpp \ src/test/regex_tests.cpp \ ${sources} TESTS = gource_tests gource-0.54/gource.pro0000644002342600234260000000645314362112040014575 0ustar andrewcandrewc# Note: this project file currently only implements building on Windows with Mingw-w64 # See the INSTALL file for building instructions TEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG -= qt DEFINES -= UNICODE CONFIG += c++11 CONFIG += object_parallel_to_source gcc { QMAKE_CXXFLAGS_WARN_ON = -Wall -Wno-unused-variable -Wno-sign-compare -Wno-unused-parameter -Wno-reorder QMAKE_CXXFLAGS_DEBUG += -DASSERTS_ENABLED } mingw { QMAKE_CXXFLAGS += -Dmain=SDL_main QMAKE_LFLAGS += -mconsole INCLUDEPATH += C:\msys64\mingw64\include\SDL2 INCLUDEPATH += C:\msys64\mingw64\include\freetype2 LIBS += -lmingw32 -lSDL2main -lSDL2.dll LIBS += -lSDL2_image.dll -lfreetype.dll -lpcre2-8.dll -lpng.dll -lglew32.dll -lboost_system-mt -lboost_filesystem-mt -lopengl32 -lglu32 LIBS += -static-libgcc -static-libstdc++ LIBS += -lcomdlg32 } VPATH += ./src SOURCES += \ action.cpp \ bloom.cpp \ caption.cpp \ dirnode.cpp \ file.cpp \ gource.cpp \ gource_settings.cpp \ gource_shell.cpp \ key.cpp \ logmill.cpp \ main.cpp \ pawn.cpp \ slider.cpp \ spline.cpp \ textbox.cpp \ user.cpp \ zoomcamera.cpp \ formats/apache.cpp \ formats/bzr.cpp \ formats/commitlog.cpp \ formats/custom.cpp \ formats/cvs-exp.cpp \ formats/cvs2cl.cpp \ formats/git.cpp \ formats/gitraw.cpp \ formats/hg.cpp \ formats/svn.cpp \ tinyxml/tinystr.cpp \ tinyxml/tinyxml.cpp \ tinyxml/tinyxmlerror.cpp \ tinyxml/tinyxmlparser.cpp \ core/conffile.cpp \ core/display.cpp \ core/frustum.cpp \ core/fxfont.cpp \ core/logger.cpp \ core/mousecursor.cpp \ core/plane.cpp \ core/png_writer.cpp \ core/ppm.cpp \ core/quadtree.cpp \ core/regex.cpp \ core/resource.cpp \ core/sdlapp.cpp \ core/seeklog.cpp \ core/settings.cpp \ core/shader.cpp \ core/shader_common.cpp \ core/stringhash.cpp \ core/texture.cpp \ core/tga.cpp \ core/timezone.cpp \ core/vbo.cpp \ core/vectors.cpp HEADERS += \ action.h \ bloom.h \ caption.h \ dirnode.h \ file.h \ gource.h \ gource_settings.h \ gource_shell.h \ key.h \ logmill.h \ main.h \ pawn.h \ slider.h \ spline.h \ textbox.h \ user.h \ zoomcamera.h \ formats/apache.h \ formats/bzr.h \ formats/commitlog.h \ formats/custom.h \ formats/cvs-exp.h \ formats/cvs2cl.h \ formats/git.h \ formats/gitraw.h \ formats/hg.h \ formats/svn.h \ tinyxml/tinystr.h \ tinyxml/tinyxml.h \ core/bounds.h \ core/conffile.h \ core/display.h \ core/frustum.h \ core/fxfont.h \ core/gl.h \ core/logger.h \ core/mousecursor.h \ core/pi.h \ core/plane.h \ core/png_writer.h \ core/ppm.h \ core/quadtree.h \ core/regex.h \ core/resource.h \ core/sdlapp.h \ core/seeklog.h \ core/settings.h \ core/shader.h \ core/shader_common.h \ core/stringhash.h \ core/texture.h \ core/tga.h \ core/timezone.h \ core/vbo.h \ core/vectors.h DISTFILES += \ data/shaders/bloom.frag \ data/shaders/shadow.frag \ data/shaders/text.frag \ data/shaders/bloom.vert \ data/shaders/shadow.vert \ data/shaders/text.vert gource-0.54/INSTALL0000644002342600234260000000351414362112040013613 0ustar andrewcandrewcThis file is to help you configure, build and install Gource for your system. Contents ======== 1. Dependencies 2. Building 3. Configure Options 1. Dependencies =============== Gource requires the following libraries to compile (package names may vary): SDL 2.0 (libsdl2-dev) SDL Image 2.0 (libsdl2-image-dev) PCRE2 (libpcre2-dev) Freetype 2 (libfreetype6-dev) GLEW (libglew-dev) GLM >= 0.9.3 (libglm-dev) Boost Filesystem >= 1.46 (libboost-filesystem-dev) PNG >= 1.2 (libpng-dev) Optional: TinyXML (libtinyxml-dev) SDL Image 2.0 needs to have been built with support PNG and JPEG images. 2. Building =========== Gource requires a GNU compatible C++ compiler that supports c++0x features such as 'auto' and the new 'for' loop syntax. GCC 4.6+ or Clang recommended. If you got the source directly from the Gource.git repository, you will first need to run autogen.sh which will generate the configure script and initialize and update the submodules. ./autogen.sh Generic build instructions for Linux/Mac OS: ./configure make make install Building on Windows: On Windows compile gource.pro with Qt Creator. A pre-built version for Windows is normally available from the homepage. Gource expects SDL to have been built with the NO_STDIO_REDIRECT flag. 3. Configure Options ==================== By default Gource will install some GNU FreeFont TTF Fonts on your system. If you already have these fonts, you can configure Gource to use them with: ./configure --enable-ttf-font-dir=/path/to/freefont/ You can also build Gource with a different font: ./configure --enable-font-file=/path/to/alternate/font.ttf The font file format must be supported by Free Type 2. Gource includes a copy of TinyXML. To build against the system version of the library use: ./configure --with-tinyxml gource-0.54/configure.ac0000644002342600234260000000530014362112040015043 0ustar andrewcandrewc# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ(2.61) AC_INIT(Gource, 0.54, [acaudwell@gmail.com]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_SRCDIR([src/main.h]) AM_INIT_AUTOMAKE([dist-bzip2 foreign subdir-objects]) AC_CANONICAL_HOST # Checks for programs. AC_PROG_CXX AC_LANG(C++) AC_CHECK_FUNCS([timegm unsetenv]) #Disable X11 on Macs unless required AS_IF([test "$with_x" != yes], [ case "$host_os" in darwin*) with_x="no" LIBS="$LIBS -framework CoreFoundation" ;; esac ], []) #GL AX_CHECK_GL AX_CHECK_GLU CXXFLAGS="$CXXFLAGS $GL_CFLAGS $GLU_CFLAGS" CPPFLAGS="$CPPFLAGS $GL_CFLAGS $GLU_CFLAGS" LIBS="$LIBS $GL_LIBS $GLU_LIBS" PKG_CHECK_MODULES([FT2], [freetype2 >= 9.0.3]) PKG_CHECK_MODULES([PCRE2], [libpcre2-8]) PKG_CHECK_MODULES([GLEW], [glew]) PKG_CHECK_MODULES([SDL2], [sdl2 SDL2_image]); PKG_CHECK_MODULES([PNG], [libpng >= 1.2]) CPPFLAGS="${CPPFLAGS} ${FT2_CFLAGS} ${PCRE2_CFLAGS} ${GLEW_CFLAGS} ${SDL2_CFLAGS} ${PNG_CFLAGS}" LIBS="${LIBS} ${FT2_LIBS} ${PCRE2_LIBS} ${GLEW_LIBS} ${SDL2_LIBS} ${PNG_LIBS}" AC_CHECK_FUNCS([IMG_LoadPNG_RW], , AC_MSG_ERROR([SDL2_image with PNG support required. Please see INSTALL])) AC_CHECK_FUNCS([IMG_LoadJPG_RW], , AC_MSG_ERROR([SDL2_image with JPEG support required. Please see INSTALL])) #BOOST AX_BOOST_BASE([1.46], , AC_MSG_ERROR(Boost Filesystem >= 1.46 is required. Please see INSTALL)) AX_BOOST_SYSTEM AX_BOOST_FILESYSTEM CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" LIBS="$LIBS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB" AC_ARG_ENABLE(font-file,[AS_HELP_STRING([--enable-font-file=FILE],[override the default font])],[gourcefontfile="$enableval"],[gourcefontfile=""]) AM_CONDITIONAL([FONTFILE], [test "x$gourcefontfile" != "x"]) AC_SUBST(gourcefontfile) #see if ttf-font-dir option is enabled AC_ARG_ENABLE(ttf-font-dir,[AS_HELP_STRING([--enable-ttf-font-dir=DIR],[directory containing GNU FreeFont TTF fonts])],[gourcefontdir="$enableval"],[gourcefontdir=""]) AM_CONDITIONAL([FONTDIR], [test "x$gourcefontdir" != "x"]) AC_SUBST(gourcefontdir) #GLM AC_CHECK_HEADER([glm/glm.hpp],, AC_MSG_ERROR(GLM headers are required. Please see INSTALL)) #see if building against system TinyXML library use_tinyxml_system_library=no AC_ARG_WITH(tinyxml, AS_HELP_STRING([--with-tinyxml],[Use system installed TinyXML library]), use_tinyxml_system_library=$withval) if test "x$use_tinyxml_system_library" = "xyes"; then AC_CHECK_LIB([tinyxml],[main],[],[AC_MSG_ERROR(TinyXML library was requested but not found)],[])ac_cv_lib_tinyxml=ac_cv_lib_tinyxml_main fi AM_CONDITIONAL(USE_BUNDLED_TINYXML, test "x$use_tinyxml_system_library" != "xyes") AC_CONFIG_FILES([Makefile]) AC_OUTPUT gource-0.54/THANKS0000644002342600234260000000010714362112040013470 0ustar andrewcandrewcCheers to everyone at Catalyst IT for their support and encouragement. gource-0.54/README.md0000644002342600234260000003313714362112040014045 0ustar andrewcandrewcGource ====== https://gource.io Description =========== Gource is a visualization tool for source control repositories. The repository is displayed as a tree where the root of the repository is the centre, directories are branches and files are leaves. Contributors to the source code appear and disappear as they contribute to specific files and directories. Requirements ============ Gource's display is rendered using OpenGL and requires a 3D accelerated video card to run. Using Gource ============ ``` gource [options] [path] options: -h, --help Help ('-H' for extended help). -WIDTHxHEIGHT, --viewport WIDTHxHEIGHT Set the viewport size. If -f is also supplied, will attempt to set the video mode to this also. Add ! to make the window non-resizable. --screen SCREEN Set the number of the screen to display on. --high-dpi Request a high DPI display when creating the window. On some platforms such as MacOS, the window resolution is specified in points instead of pixels. The --high-dpi flag may be required to access some higher resolutions. E.g. requesting a high DPI 800x600 window may produce a window that is 1600x1200 pixels. --window-position XxY Initial window position on your desktop which may be made up of multiple monitors. This will override the screen setting so don't specify both. --frameless Frameless window. -f, --fullscreen Fullscreen. -w, --windowed Windowed. --transparent Make the background transparent. Only really useful for screenshots. --start-date "YYYY-MM-DD hh:mm:ss +tz" Start with the first entry after the supplied date and optional time. If a time zone offset isn't specified the local time zone is used. Example accepted formats: "2012-06-30" "2012-06-30 12:00" "2012-06-30 12:00:00 +12" --stop-date "YYYY-MM-DD hh:mm:ss +tz" Stop after the last entry prior to the supplied date and optional time. Uses the same format as --start-date. -p, --start-position POSITION Begin at some position in the log (between 0.0 and 1.0 or 'random'). --stop-position POSITION Stop (exit) at some position in the log (does not work with STDIN). -t, --stop-at-time SECONDS Stop (exit) after a specified number of seconds. --stop-at-end Stop (exit) at the end of the log / stream. --loop Loop back to the start of the log when the end is reached. --loop-delay-seconds Seconds to delay before looping. -a, --auto-skip-seconds SECONDS Skip to next entry if nothing happens for a number of seconds. -s, --seconds-per-day SECONDS Speed of simulation in seconds per day. --realtime Realtime playback speed. --no-time-travel Use the time of the last commit if the time of a commit is in the past. -c, --time-scale SCALE Change simulation time scale. E.g. 0.5 for half speed, 2 for double speed. -i, --file-idle-time SECONDS Time in seconds files remain idle before they are removed or 0 for no limit. --file-idle-time-at-end SECONDS Time in seconds files remain idle at the end before they are removed. -e, --elasticity FLOAT Elasticity of nodes. -b, --background-colour FFFFFF Background colour in hex. --background-image IMAGE Set a background image. --logo IMAGE Logo to display in the foreground. --logo-offset XxY Offset position of the logo. --title TITLE Set a title. --font-file FILE Specify the font. Should work with most font file formats supported by FreeType, such as TTF and OTF, among others. --font-scale SCALE Scale the size of all fonts. --font-size SIZE Font size used by the date and title. --file-font-size SIZE Font size of filenames. --dir-font-size SIZE Font size of directory names --user-font-size SIZE Font size of user names. --font-colour FFFFFF Font colour used by the date and title in hex. --key Show file extension key. --date-format FORMAT Specify display date string (strftime format). --log-command VCS Show the VCS log command used by gource (git,svn,hg,bzr,cvs2cl). --log-format VCS Specify the log format (git,svn,hg,bzr,cvs2cl,custom). Required when reading from STDIN. --git-branch Get the git log of a branch other than the current one. --follow-user USER Have the camera automatically follow a particular user. --highlight-dirs Highlight the names of all directories. --highlight-user USER Highlight the names of a particular user. --highlight-users Highlight the names of all users. --highlight-colour FFFFFF Font colour for highlighted users in hex. --selection-colour FFFFFF Font colour for selected users and files. --filename-colour FFFFFF Font colour for filenames. --dir-colour FFFFFF Font colour for directories. --dir-name-depth DEPTH Draw names of directories down to a specific depth in the tree. --dir-name-position FLOAT Position along edge of the directory name (between 0.1 and 1.0, default is 0.5). --filename-time SECONDS Duration to keep filenames on screen (>= 2.0). --file-extensions Show filename extensions only. --file-extension-fallback Use filename as extension if the extension is missing or empty. --file-filter REGEX Filter out file paths matching the specified regular expression. --file-show-filter REGEX Show only file paths matching the specified regular expression. --user-filter REGEX Filter usernames matching the specified regular expression. --user-show-filter REGEX Show only usernames matching the specified regular expression. --user-image-dir DIRECTORY Directory containing .jpg or .png images of users (eg "Full Name.png") to use as avatars. --default-user-image IMAGE Path of .jpg or .png to use as the default user image. --fixed-user-size Forces the size of the user image to remain fixed throughout. --colour-images Colourize user images. --crop AXIS Crop view on an axis (vertical,horizontal). --padding FLOAT Camera view padding. --multi-sampling Enable multi-sampling. --no-vsync Disable vsync. --bloom-multiplier FLOAT Adjust the amount of bloom. --bloom-intensity FLOAT Adjust the intensity of the bloom. --max-files NUMBER Set the maximum number of files or 0 for no limit. Excess files will be discarded. --max-file-lag SECONDS Max time files of a commit can take to appear. Use -1 for no limit. --max-user-speed UNITS Max speed users can travel per second. --user-friction SECONDS Time users take to come to a halt. --user-scale SCALE Change scale of user avatars. --camera-mode MODE Camera mode (overview,track). --disable-auto-rotate Disable automatic camera rotation. --disable-input Disable keyboard and mouse input. --hide DISPLAY_ELEMENT Hide one or more display elements from the list below: bloom - bloom effect date - current date dirnames - names of directories files - file icons filenames - names of files mouse - mouse cursor progress - progress bar widget root - root directory of tree tree - animated tree structure users - user avatars usernames - names of users Separate multiple elements with commas (eg "mouse,progress") --hash-seed SEED Change the seed of hash function. --caption-file FILE Caption file (see Caption Log Format). --caption-size SIZE Caption size. --caption-colour FFFFFF Caption colour in hex. --caption-duration SECONDS Caption duration. --caption-offset X Caption horizontal offset (0 to centre captions). -o, --output-ppm-stream FILE Output a PPM image stream to a file ('-' for STDOUT). This will automatically hide the progress bar initially and enable 'stop-at-end' unless other behaviour is specified. -r, --output-framerate FPS Framerate of output (25,30,60). Used with --output-ppm-stream. --output-custom-log FILE Output a custom format log file ('-' for STDOUT). --load-config CONFIG_FILE Load a gource conf file. --save-config CONFIG_FILE Save a gource conf file with the current options. --path PATH path Either a supported version control directory, a pre-generated log file (see log commands or the custom log format), a Gource conf file or '-' to read STDIN. If path is omitted, gource will attempt to read a log from the current directory. ``` Git, Bazaar, Mercurial and SVN Examples: View the log of the repository in the current path: ``` gource ``` View the log of a project in the specified directory: ``` gource my-project-dir ``` For large projects, generating a log of the project history may take a long time. For centralized VCS like SVN, generating the log may also put load on the central VCS server. In these cases, you may like to save a copy of the log for later use. You can generate a log in the VCS specific log format using the --log-command VCS option: ``` cd my-svn-project `gource --log-command svn` > my-svn-project.log gource my-svn-project.log ``` You can also have Gource write a copy of the log file in its own format: ``` gource --output-custom-log my-project-custom.log ``` CVS Support: Use 'cvs2cl' to generate the log and then pass it to Gource: ``` cvs2cl --chrono --stdout --xml -g-q > my-cvs-project.log gource my-cvs-project.log ``` Custom Log Format: If you want to use Gource with something other than the supported systems, there is a pipe ('|') delimited custom log format: timestamp - An ISO 8601 or unix timestamp of when the update occurred. username - The name of the user who made the update. type - initial for the update type - (A)dded, (M)odified or (D)eleted. file - Path of the file updated. colour - A colour for the file in hex (FFFFFF) format. Optional. Caption Log Format: Gource can display captions along the timeline by specifying a caption file (using --caption-file) in the pipe ('|') delimited format below: timestamp - An ISO 8601 or A unix timestamp of when to display the caption. caption - The caption Recording Videos: See the guide on the homepage for examples of recording videos with Gource: https://github.com/acaudwell/Gource/wiki/Videos More Information: Visit the Gource homepage for guides and examples of using Gource with various version control systems: https://gource.io Interface: The time shown in the top left of the screen is set initially from the first log entry read and is incremented according to the simulation speed (--seconds-per-day). Pressing SPACE at any time will pause/resume the simulation. While paused you may use the mouse to inspect the detail of individual files and users. TAB cycles through selecting the current visible users. The camera mode, either tracking activity or showing the entire code tree, can be toggled using the Middle mouse button. You can drag the left mouse button to manually control the camera. The right mouse button rotates the view. Interactive keyboard commands: (V) Toggle camera mode (C) Displays Gource logo (K) Toggle file extension key (M) Toggle mouse visibility (N) Jump forward in time to next log entry (S) Randomize colours (D) Toggle directory name display mode (F) Toggle file name display mode (U) Toggle user name display mode (G) Toggle display of users (T) Toggle display of directory tree edges (R) Toggle display of root directory edges (+-) Adjust simulation speed (<>) Adjust time scale (TAB) Cycle through visible users (F12) Screenshot (Alt+Enter) Fullscreen toggle (ESC) Quit Copyright ========= Gource - software version control visualization Copyright (C) 2009 Andrew Caudwell This program is free software: you can 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 . gource-0.54/configure0000755002342600234260000105611314362112040014475 0ustar andrewcandrewc#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Gource 0.54. # # 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 \$(( 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: acaudwell@gmail.com about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do 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'" 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='Gource' PACKAGE_TARNAME='gource' PACKAGE_VERSION='0.54' PACKAGE_STRING='Gource 0.54' PACKAGE_BUGREPORT='acaudwell@gmail.com' PACKAGE_URL='' ac_unique_file="src/main.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS USE_BUNDLED_TINYXML_FALSE USE_BUNDLED_TINYXML_TRUE gourcefontdir FONTDIR_FALSE FONTDIR_TRUE gourcefontfile FONTFILE_FALSE FONTFILE_TRUE BOOST_FILESYSTEM_LIB BOOST_SYSTEM_LIB BOOST_LDFLAGS BOOST_CPPFLAGS PNG_LIBS PNG_CFLAGS SDL2_LIBS SDL2_CFLAGS GLEW_LIBS GLEW_CFLAGS PCRE2_LIBS PCRE2_CFLAGS FT2_LIBS FT2_CFLAGS GLU_LIBS GLU_CFLAGS CPP EGREP GREP CXXCPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC GL_LIBS GL_CFLAGS PKG_CONFIG am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX host_os host_vendor host_cpu host build_os build_vendor build_cpu build 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 runstatedir 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 am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking with_xquartz_gl with_boost with_boost_libdir with_boost_system with_boost_filesystem enable_font_file enable_ttf_font_dir with_tinyxml ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC PKG_CONFIG GL_CFLAGS GL_LIBS CC CFLAGS CXXCPP CPP GLU_CFLAGS GLU_LIBS FT2_CFLAGS FT2_LIBS PCRE2_CFLAGS PCRE2_LIBS GLEW_CFLAGS GLEW_LIBS SDL2_CFLAGS SDL2_LIBS PNG_CFLAGS PNG_LIBS' # 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' runstatedir='${localstatedir}/run' 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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -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 runstatedir 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 Gource 0.54 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] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --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/gource] --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 Gource 0.54:";; 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-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-font-file=FILE override the default font --enable-ttf-font-dir=DIR directory containing GNU FreeFont TTF fonts Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-xquartz-gl[=DIR] On Mac OSX, use opengl provided by X11/XQuartz instead of the built-in framework. If enabled, the default location is [DIR=/opt/X11]. This option is default to false. --with-boost[=ARG] use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) [ARG=yes] --with-boost-libdir=LIB_DIR Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located. --with-boost-system[=special-lib] use the System library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-system=boost_system-gcc-mt --with-boost-filesystem[=special-lib] use the Filesystem library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-filesystem=boost_filesystem-gcc-mt --with-tinyxml Use system installed TinyXML library Some influential environment variables: CXX C++ compiler command CXXFLAGS 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 PKG_CONFIG path to pkg-config utility GL_CFLAGS C compiler flags for GL, overriding configure script defaults GL_LIBS Linker flags for GL, overriding configure script defaults CC C compiler command CFLAGS C compiler flags CXXCPP C++ preprocessor CPP C preprocessor GLU_CFLAGS C compiler flags for GLU, overriding system check GLU_LIBS Linker flags for GLU, overriding system check FT2_CFLAGS C compiler flags for FT2, overriding pkg-config FT2_LIBS linker flags for FT2, overriding pkg-config PCRE2_CFLAGS C compiler flags for PCRE2, overriding pkg-config PCRE2_LIBS linker flags for PCRE2, overriding pkg-config GLEW_CFLAGS C compiler flags for GLEW, overriding pkg-config GLEW_LIBS linker flags for GLEW, overriding pkg-config SDL2_CFLAGS C compiler flags for SDL2, overriding pkg-config SDL2_LIBS linker flags for SDL2, overriding pkg-config PNG_CFLAGS C compiler flags for PNG, overriding pkg-config PNG_LIBS linker flags for PNG, overriding pkg-config 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 Gource configure 0.54 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_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_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_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 # 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_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_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_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $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 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------- ## ## Report this to acaudwell@gmail.com ## ## ---------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $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 eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_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_cxx_try_run # ac_fn_cxx_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_cxx_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_cxx_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_cxx_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_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $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 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------- ## ## Report this to acaudwell@gmail.com ## ## ---------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $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 eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # 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 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 Gource $as_me 0.54, 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 # 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_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; 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 build-aux \"$srcdir\"/build-aux" "$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. am__api_version='1.16' # 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+set}" != 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='gource' VERSION='0.54' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # 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 (and possibly the TAP driver). 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 pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # 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 # Checks for programs. 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 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_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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # 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="$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 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 for ac_func in timegm unsetenv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done #Disable X11 on Macs unless required if test "$with_x" != yes; then : case "$host_os" in darwin*) with_x="no" LIBS="$LIBS -framework CoreFoundation" ;; esac fi #GL 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 # Check whether --with-xquartz-gl was given. if test "${with_xquartz_gl+set}" = set; then : withval=$with_xquartz_gl; if test "X$with_xquartz_gl"="Xyes"; then : with_xquartz_gl="/opt/X11" fi else with_xquartz_gl=no fi if test "X$with_xquartz_gl" != "Xno"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking OSX X11 path" >&5 $as_echo_n "checking OSX X11 path... " >&6; } if test -e "$with_xquartz_gl"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$with_xquartz_gl\"" >&5 $as_echo "\"$with_xquartz_gl\"" >&6; } CFLAGS="-I$with_xquartz_gl/include $CFLAGS" LIBS="-L$with_xquartz_gl/lib $LIBS" else with_xquartz_gl=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-xquartz-gl was given, but test for X11 failed. Fallback to system framework" >&5 $as_echo "$as_me: WARNING: --with-xquartz-gl was given, but test for X11 failed. Fallback to system framework" >&2;} 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 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 { $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 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 whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_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. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != 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=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $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 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=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 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 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_cxx_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_cxx_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_cxx_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 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 case ${host} in #( *-darwin*) : if test "x$with_xquartz_gl" != "xno"; then : GL_LIBS="${GL_LIBS:--lGL}" else GL_LIBS="${GL_LIBS:--framework OpenGL}" fi ;; #( *-cygwin*|*-mingw*) : if test -n "$GL_LIBS"; then : else ax_check_gl_manual_libs_generic_extra_libs="opengl32 GL gl" if test "X$ax_check_gl_manual_libs_generic_extra_libs" = "X"; then : as_fn_error $? "AX_CHECK_GL_MANUAL_LIBS_GENERIC argument must no be empty" "$LINENO" 5 fi _ax_gl_saved_flag_cflags="$CFLAGS" CFLAGS="$GL_CFLAGS $CFLAGS" 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 library containing glBegin" >&5 $as_echo_n "checking for library containing glBegin... " >&6; } if ${ac_cv_search_glBegin+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 glBegin (); int main () { return glBegin (); ; return 0; } _ACEOF for ac_lib in '' $ax_check_gl_manual_libs_generic_extra_libs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_glBegin=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_glBegin+:} false; then : break fi done if ${ac_cv_search_glBegin+:} false; then : else ac_cv_search_glBegin=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_glBegin" >&5 $as_echo "$ac_cv_search_glBegin" >&6; } ac_res=$ac_cv_search_glBegin if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ax_check_gl_lib_opengl="yes" break fi if test "X$ax_check_gl_lib_opengl"="Xyes"; then : GL_LIBS="${ac_cv_search_glBegin}" fi CFLAGS="$_ax_gl_saved_flag_cflags" 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 fi for ac_header in windows.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINDOWS_H 1 _ACEOF fi done ;; #( *) : 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 GL" >&5 $as_echo_n "checking for GL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GL_CFLAGS"; then pkg_cv_GL_CFLAGS="$GL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gl\""; } >&5 ($PKG_CONFIG --exists --print-errors "gl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GL_CFLAGS=`$PKG_CONFIG --cflags "gl" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GL_LIBS"; then pkg_cv_GL_LIBS="$GL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gl\""; } >&5 ($PKG_CONFIG --exists --print-errors "gl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GL_LIBS=`$PKG_CONFIG --libs "gl" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gl"` else GL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gl"` fi # Put the nasty error message in config.log where it belongs echo "$GL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test -n "$GL_LIBS"; then : else ax_check_gl_manual_libs_generic_extra_libs="GL gl" if test "X$ax_check_gl_manual_libs_generic_extra_libs" = "X"; then : as_fn_error $? "AX_CHECK_GL_MANUAL_LIBS_GENERIC argument must no be empty" "$LINENO" 5 fi _ax_gl_saved_flag_cflags="$CFLAGS" CFLAGS="$GL_CFLAGS $CFLAGS" 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 library containing glBegin" >&5 $as_echo_n "checking for library containing glBegin... " >&6; } if ${ac_cv_search_glBegin+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 glBegin (); int main () { return glBegin (); ; return 0; } _ACEOF for ac_lib in '' $ax_check_gl_manual_libs_generic_extra_libs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_glBegin=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_glBegin+:} false; then : break fi done if ${ac_cv_search_glBegin+:} false; then : else ac_cv_search_glBegin=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_glBegin" >&5 $as_echo "$ac_cv_search_glBegin" >&6; } ac_res=$ac_cv_search_glBegin if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ax_check_gl_lib_opengl="yes" break fi if test "X$ax_check_gl_lib_opengl"="Xyes"; then : GL_LIBS="${ac_cv_search_glBegin}" fi CFLAGS="$_ax_gl_saved_flag_cflags" 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 fi elif test $pkg_failed = untried; then if test -n "$GL_LIBS"; then : else ax_check_gl_manual_libs_generic_extra_libs="GL gl" if test "X$ax_check_gl_manual_libs_generic_extra_libs" = "X"; then : as_fn_error $? "AX_CHECK_GL_MANUAL_LIBS_GENERIC argument must no be empty" "$LINENO" 5 fi _ax_gl_saved_flag_cflags="$CFLAGS" CFLAGS="$GL_CFLAGS $CFLAGS" 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 library containing glBegin" >&5 $as_echo_n "checking for library containing glBegin... " >&6; } if ${ac_cv_search_glBegin+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 glBegin (); int main () { return glBegin (); ; return 0; } _ACEOF for ac_lib in '' $ax_check_gl_manual_libs_generic_extra_libs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_glBegin=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_glBegin+:} false; then : break fi done if ${ac_cv_search_glBegin+:} false; then : else ac_cv_search_glBegin=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_glBegin" >&5 $as_echo "$ac_cv_search_glBegin" >&6; } ac_res=$ac_cv_search_glBegin if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ax_check_gl_lib_opengl="yes" break fi if test "X$ax_check_gl_lib_opengl"="Xyes"; then : GL_LIBS="${ac_cv_search_glBegin}" fi CFLAGS="$_ax_gl_saved_flag_cflags" 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 fi else GL_CFLAGS=$pkg_cv_GL_CFLAGS GL_LIBS=$pkg_cv_GL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi ;; esac _ax_gl_saved_flag_cflags="$CFLAGS" CFLAGS="$GL_CFLAGS $CFLAGS" 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 for ac_header in GL/gl.h OpenGL/gl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$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 ax_check_gl_have_headers="yes";break fi done CFLAGS="$_ax_gl_saved_flag_cflags" 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$ax_check_gl_have_headers" = "Xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiling a minimal OpenGL program" >&5 $as_echo_n "checking for compiling a minimal OpenGL program... " >&6; } if ${ax_cv_check_gl_compile_opengl+:} false; then : $as_echo_n "(cached) " >&6 else _ax_gl_saved_flag_cflags="$CFLAGS" CFLAGS="$GL_CFLAGS $CFLAGS" 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. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GL_H # include # elif defined(HAVE_OPENGL_GL_H) # include # else # error no gl.h # endif int main () { glBegin(0) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_check_gl_compile_opengl="yes" else ax_check_gl_compile_opengl="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$_ax_gl_saved_flag_cflags" 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 ax_cv_check_gl_compile_opengl="${ax_check_gl_compile_opengl}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_gl_compile_opengl" >&5 $as_echo "$ax_cv_check_gl_compile_opengl" >&6; } ax_check_gl_compile_opengl="${ax_cv_check_gl_compile_opengl}" else no_gl=yes fi if test "X$ax_check_gl_compile_opengl" = "Xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking a minimal OpenGL program" >&5 $as_echo_n "checking for linking a minimal OpenGL program... " >&6; } if ${ax_cv_check_gl_link_opengl+:} false; then : $as_echo_n "(cached) " >&6 else _ax_gl_saved_flag_cflags="$CFLAGS" CFLAGS="$GL_CFLAGS $CFLAGS" _ax_gl_saved_flag_libs="$LIBS" LIBS="$GL_LIBS $LIBS" _ax_gl_saved_flag_ldflags="$LDFLAGS" LDFLAGS="$GL_LDFLAGS $LDFLAGS" 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. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GL_H # include # elif defined(HAVE_OPENGL_GL_H) # include # else # error no gl.h # endif int main () { glBegin(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_check_gl_link_opengl="yes" else ax_check_gl_link_opengl="no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$_ax_gl_saved_flag_cflags" LIBS="$_ax_gl_saved_flag_libs" LDFLAGS="$_ax_gl_saved_flag_ldflags" 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 ax_cv_check_gl_link_opengl="${ax_check_gl_link_opengl}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_gl_link_opengl" >&5 $as_echo "$ax_cv_check_gl_link_opengl" >&6; } ax_check_gl_link_opengl="${ax_cv_check_gl_link_opengl}" else no_gl=yes fi if test "X$no_gl" = "X"; then : $as_echo "#define HAVE_GL 1" >>confdefs.h CFLAGS="$GL_CFLAGS $CFLAGS" LIBS="$GL_LIBS $LIBS" else as_fn_error $? "Could not find a valid OpenGL implementation" "$LINENO" 5 fi case ${host} in #( *-darwin*) : if test "x$with_xquartz_gl" != "xno"; then : GLU_LIBS="${GLU_LIBS:--lGLU}" else GLU_LIBS="${GLU_LIBS:--framework OpenGL}" fi ;; #( *-cygwin*) : 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" _ax_glu_saved_flag_libs="$LIBS" LIBS="$GLU_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gluBeginCurve" >&5 $as_echo_n "checking for library containing gluBeginCurve... " >&6; } if ${ac_cv_search_gluBeginCurve+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 gluBeginCurve (); int main () { return gluBeginCurve (); ; return 0; } _ACEOF for ac_lib in '' GLU glu MesaGLU glu32; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gluBeginCurve=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gluBeginCurve+:} false; then : break fi done if ${ac_cv_search_gluBeginCurve+:} false; then : else ac_cv_search_gluBeginCurve=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gluBeginCurve" >&5 $as_echo "$ac_cv_search_gluBeginCurve" >&6; } ac_res=$ac_cv_search_gluBeginCurve if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" GLU_LIBS="${GLU_LIBS:-$ac_cv_search_gluBeginCurve}" fi CFLAGS="$_ax_glu_saved_flag_cflags" LIBS="$_ax_glu_saved_flag_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 for ac_header in windows.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINDOWS_H 1 _ACEOF fi done ;; #( # try first native *-mingw*) : 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" _ax_glu_saved_flag_libs="$LIBS" LIBS="$GLU_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gluBeginCurve" >&5 $as_echo_n "checking for library containing gluBeginCurve... " >&6; } if ${ac_cv_search_gluBeginCurve+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 gluBeginCurve (); int main () { return gluBeginCurve (); ; return 0; } _ACEOF for ac_lib in '' glu32 GLU glu MesaGLU; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gluBeginCurve=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gluBeginCurve+:} false; then : break fi done if ${ac_cv_search_gluBeginCurve+:} false; then : else ac_cv_search_gluBeginCurve=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gluBeginCurve" >&5 $as_echo "$ac_cv_search_gluBeginCurve" >&6; } ac_res=$ac_cv_search_gluBeginCurve if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" GLU_LIBS="${GLU_LIBS:-$ac_cv_search_gluBeginCurve}" fi CFLAGS="$_ax_glu_saved_flag_cflags" LIBS="$_ax_glu_saved_flag_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 for ac_header in windows.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINDOWS_H 1 _ACEOF fi done ;; #( *) : 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 GLU" >&5 $as_echo_n "checking for GLU... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GLU_CFLAGS"; then pkg_cv_GLU_CFLAGS="$GLU_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glu\""; } >&5 ($PKG_CONFIG --exists --print-errors "glu") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLU_CFLAGS=`$PKG_CONFIG --cflags "glu" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GLU_LIBS"; then pkg_cv_GLU_LIBS="$GLU_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glu\""; } >&5 ($PKG_CONFIG --exists --print-errors "glu") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLU_LIBS=`$PKG_CONFIG --libs "glu" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GLU_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glu"` else GLU_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glu"` fi # Put the nasty error message in config.log where it belongs echo "$GLU_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" _ax_glu_saved_flag_libs="$LIBS" LIBS="$GLU_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gluBeginCurve" >&5 $as_echo_n "checking for library containing gluBeginCurve... " >&6; } if ${ac_cv_search_gluBeginCurve+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 gluBeginCurve (); int main () { return gluBeginCurve (); ; return 0; } _ACEOF for ac_lib in '' GLU glu MesaGLU; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gluBeginCurve=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gluBeginCurve+:} false; then : break fi done if ${ac_cv_search_gluBeginCurve+:} false; then : else ac_cv_search_gluBeginCurve=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gluBeginCurve" >&5 $as_echo "$ac_cv_search_gluBeginCurve" >&6; } ac_res=$ac_cv_search_gluBeginCurve if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" GLU_LIBS="${GLU_LIBS:-$ac_cv_search_gluBeginCurve}" fi CFLAGS="$_ax_glu_saved_flag_cflags" LIBS="$_ax_glu_saved_flag_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 elif test $pkg_failed = untried; then 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" _ax_glu_saved_flag_libs="$LIBS" LIBS="$GLU_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gluBeginCurve" >&5 $as_echo_n "checking for library containing gluBeginCurve... " >&6; } if ${ac_cv_search_gluBeginCurve+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 gluBeginCurve (); int main () { return gluBeginCurve (); ; return 0; } _ACEOF for ac_lib in '' GLU glu MesaGLU; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gluBeginCurve=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gluBeginCurve+:} false; then : break fi done if ${ac_cv_search_gluBeginCurve+:} false; then : else ac_cv_search_gluBeginCurve=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gluBeginCurve" >&5 $as_echo "$ac_cv_search_gluBeginCurve" >&6; } ac_res=$ac_cv_search_gluBeginCurve if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" GLU_LIBS="${GLU_LIBS:-$ac_cv_search_gluBeginCurve}" fi CFLAGS="$_ax_glu_saved_flag_cflags" LIBS="$_ax_glu_saved_flag_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 else GLU_CFLAGS=$pkg_cv_GLU_CFLAGS GLU_LIBS=$pkg_cv_GLU_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi ;; esac case $host in #( *-darwin*) : if test "X$with_xquartz_gl" = "Xno"; then : 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" for ac_header in OpenGL/glu.h do : ac_fn_c_check_header_compile "$LINENO" "OpenGL/glu.h" "ac_cv_header_OpenGL_glu_h" " $ac_includes_default # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif " if test "x$ac_cv_header_OpenGL_glu_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OPENGL_GLU_H 1 _ACEOF ax_check_glu_have_headers="yes"; fi done CFLAGS="$_ax_glu_saved_flag_cflags" 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 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" for ac_header in GL/glu.h do : ac_fn_c_check_header_compile "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" " $ac_includes_default # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif " if test "x$ac_cv_header_GL_glu_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GLU_H 1 _ACEOF ax_check_glu_have_headers="yes"; fi done CFLAGS="$_ax_glu_saved_flag_cflags" 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 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" for ac_header in GL/glu.h do : ac_fn_c_check_header_compile "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" " $ac_includes_default # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif " if test "x$ac_cv_header_GL_glu_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GL_GLU_H 1 _ACEOF ax_check_glu_have_headers="yes"; fi done CFLAGS="$_ax_glu_saved_flag_cflags" 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 ;; esac if test "X$ax_check_glu_have_headers" = "Xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiling a minimal OpenGL Utility (GLU) program" >&5 $as_echo_n "checking for compiling a minimal OpenGL Utility (GLU) program... " >&6; } if ${ax_cv_check_glu_compile+:} 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLU_H # include # elif defined(HAVE_OPENGL_GLU_H) # include # else # error no glu.h # endif int main () { gluBeginCurve(0) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_check_glu_compile="yes" else ax_cv_check_glu_compile="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$_ax_glu_saved_flag_cflags" 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_glu_compile" >&5 $as_echo "$ax_cv_check_glu_compile" >&6; } fi if test "X$ax_cv_check_glu_compile" = "Xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linking a minimal GLU program" >&5 $as_echo_n "checking for linking a minimal GLU program... " >&6; } if ${ax_cv_check_glu_link+:} 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" _ax_glu_saved_flag_libs="$LIBS" LIBS="$GLU_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLU_H # include # elif defined(HAVE_OPENGL_GLU_H) # include # else # error no glu.h # endif int main () { gluBeginCurve(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_glu_link="yes" else ax_cv_check_glu_link="no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$_ax_glu_saved_flag_cflags" LIBS="$_ax_glu_saved_flag_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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_glu_link" >&5 $as_echo "$ax_cv_check_glu_link" >&6; } fi # # Some versions of Mac OS X include a broken interpretation of the GLU # tesselation callback function signature. if test "X$ax_cv_check_glu_link" = "Xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GLU varargs tesselator is using non-standard form" >&5 $as_echo_n "checking if GLU varargs tesselator is using non-standard form... " >&6; } if ${ax_cv_varargs_glu_tesscb+:} false; then : $as_echo_n "(cached) " >&6 else 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 _ax_glu_saved_flag_cflags="$CFLAGS" CFLAGS="$GLU_CFLAGS $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if defined(HAVE_WINDOWS_H) && defined(_WIN32) # include # endif # ifdef HAVE_GL_GLU_H # include # elif defined(HAVE_OPENGL_GLU_H) # include # else # error no glu.h # endif int main () { GLvoid (*func)(...); gluTessCallback(0, 0, func) ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_varargs_glu_tesscb="yes" else ax_cv_varargs_glu_tesscb="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$_ax_glu_saved_flag_cflags" 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_varargs_glu_tesscb" >&5 $as_echo "$ax_cv_varargs_glu_tesscb" >&6; } if test "X$ax_cv_varargs_glu_tesscb" = "yes"; then : $as_echo "#define HAVE_VARARGS_GLU_TESSCB 1" >>confdefs.h fi fi if test "X$ax_cv_check_glu_link" = "Xyes"; then : $as_echo "#define HAVE_GLU 1" >>confdefs.h CFLAGS="$GLU_CFLAGS $CFLAGS" LIBS="$GLU_LIBS $LIBS" else as_fn_error $? "Could not find a valid GLU implementation" "$LINENO" 5 fi CXXFLAGS="$CXXFLAGS $GL_CFLAGS $GLU_CFLAGS" CPPFLAGS="$CPPFLAGS $GL_CFLAGS $GLU_CFLAGS" LIBS="$LIBS $GL_LIBS $GLU_LIBS" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT2" >&5 $as_echo_n "checking for FT2... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FT2_CFLAGS"; then pkg_cv_FT2_CFLAGS="$FT2_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 9.0.3\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2 >= 9.0.3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FT2_CFLAGS=`$PKG_CONFIG --cflags "freetype2 >= 9.0.3" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FT2_LIBS"; then pkg_cv_FT2_LIBS="$FT2_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 9.0.3\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2 >= 9.0.3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FT2_LIBS=`$PKG_CONFIG --libs "freetype2 >= 9.0.3" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 FT2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "freetype2 >= 9.0.3"` else FT2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "freetype2 >= 9.0.3"` fi # Put the nasty error message in config.log where it belongs echo "$FT2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (freetype2 >= 9.0.3) were not met: $FT2_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 FT2_CFLAGS and FT2_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}: 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 FT2_CFLAGS and FT2_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 FT2_CFLAGS=$pkg_cv_FT2_CFLAGS FT2_LIBS=$pkg_cv_FT2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PCRE2" >&5 $as_echo_n "checking for PCRE2... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$PCRE2_CFLAGS"; then pkg_cv_PCRE2_CFLAGS="$PCRE2_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre2-8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcre2-8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PCRE2_CFLAGS=`$PKG_CONFIG --cflags "libpcre2-8" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$PCRE2_LIBS"; then pkg_cv_PCRE2_LIBS="$PCRE2_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre2-8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcre2-8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PCRE2_LIBS=`$PKG_CONFIG --libs "libpcre2-8" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 PCRE2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libpcre2-8"` else PCRE2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libpcre2-8"` fi # Put the nasty error message in config.log where it belongs echo "$PCRE2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpcre2-8) were not met: $PCRE2_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 PCRE2_CFLAGS and PCRE2_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}: 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 PCRE2_CFLAGS and PCRE2_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 PCRE2_CFLAGS=$pkg_cv_PCRE2_CFLAGS PCRE2_LIBS=$pkg_cv_PCRE2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLEW" >&5 $as_echo_n "checking for GLEW... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GLEW_CFLAGS"; then pkg_cv_GLEW_CFLAGS="$GLEW_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glew\""; } >&5 ($PKG_CONFIG --exists --print-errors "glew") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLEW_CFLAGS=`$PKG_CONFIG --cflags "glew" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GLEW_LIBS"; then pkg_cv_GLEW_LIBS="$GLEW_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glew\""; } >&5 ($PKG_CONFIG --exists --print-errors "glew") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLEW_LIBS=`$PKG_CONFIG --libs "glew" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GLEW_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glew"` else GLEW_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glew"` fi # Put the nasty error message in config.log where it belongs echo "$GLEW_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glew) were not met: $GLEW_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 GLEW_CFLAGS and GLEW_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}: 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 GLEW_CFLAGS and GLEW_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 GLEW_CFLAGS=$pkg_cv_GLEW_CFLAGS GLEW_LIBS=$pkg_cv_GLEW_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL2" >&5 $as_echo_n "checking for SDL2... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SDL2_CFLAGS"; then pkg_cv_SDL2_CFLAGS="$SDL2_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sdl2 SDL2_image\""; } >&5 ($PKG_CONFIG --exists --print-errors "sdl2 SDL2_image") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SDL2_CFLAGS=`$PKG_CONFIG --cflags "sdl2 SDL2_image" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SDL2_LIBS"; then pkg_cv_SDL2_LIBS="$SDL2_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sdl2 SDL2_image\""; } >&5 ($PKG_CONFIG --exists --print-errors "sdl2 SDL2_image") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SDL2_LIBS=`$PKG_CONFIG --libs "sdl2 SDL2_image" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 SDL2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "sdl2 SDL2_image"` else SDL2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "sdl2 SDL2_image"` fi # Put the nasty error message in config.log where it belongs echo "$SDL2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (sdl2 SDL2_image) were not met: $SDL2_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 SDL2_CFLAGS and SDL2_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}: 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 SDL2_CFLAGS and SDL2_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 SDL2_CFLAGS=$pkg_cv_SDL2_CFLAGS SDL2_LIBS=$pkg_cv_SDL2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi; pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG" >&5 $as_echo_n "checking for PNG... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$PNG_CFLAGS"; then pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$PNG_LIBS"; then pkg_cv_PNG_LIBS="$PNG_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libpng >= 1.2"` else PNG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libpng >= 1.2"` fi # Put the nasty error message in config.log where it belongs echo "$PNG_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpng >= 1.2) were not met: $PNG_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 PNG_CFLAGS and PNG_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}: 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 PNG_CFLAGS and PNG_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 PNG_CFLAGS=$pkg_cv_PNG_CFLAGS PNG_LIBS=$pkg_cv_PNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi CPPFLAGS="${CPPFLAGS} ${FT2_CFLAGS} ${PCRE2_CFLAGS} ${GLEW_CFLAGS} ${SDL2_CFLAGS} ${PNG_CFLAGS}" LIBS="${LIBS} ${FT2_LIBS} ${PCRE2_LIBS} ${GLEW_LIBS} ${SDL2_LIBS} ${PNG_LIBS}" for ac_func in IMG_LoadPNG_RW do : ac_fn_cxx_check_func "$LINENO" "IMG_LoadPNG_RW" "ac_cv_func_IMG_LoadPNG_RW" if test "x$ac_cv_func_IMG_LoadPNG_RW" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_IMG_LOADPNG_RW 1 _ACEOF else as_fn_error $? "SDL2_image with PNG support required. Please see INSTALL" "$LINENO" 5 fi done for ac_func in IMG_LoadJPG_RW do : ac_fn_cxx_check_func "$LINENO" "IMG_LoadJPG_RW" "ac_cv_func_IMG_LoadJPG_RW" if test "x$ac_cv_func_IMG_LoadJPG_RW" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_IMG_LOADJPG_RW 1 _ACEOF else as_fn_error $? "SDL2_image with JPEG support required. Please see INSTALL" "$LINENO" 5 fi done #BOOST # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; case $withval in #( no) : want_boost="no";_AX_BOOST_BASE_boost_path="" ;; #( yes) : want_boost="yes";_AX_BOOST_BASE_boost_path="" ;; #( *) : want_boost="yes";_AX_BOOST_BASE_boost_path="$withval" ;; esac else want_boost="yes" fi # Check whether --with-boost-libdir was given. if test "${with_boost_libdir+set}" = set; then : withval=$with_boost_libdir; if test -d "$withval"; then : _AX_BOOST_BASE_boost_lib_path="$withval" else as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5 fi else _AX_BOOST_BASE_boost_lib_path="" fi BOOST_LDFLAGS="" BOOST_CPPFLAGS="" if test "x$want_boost" = "xyes"; then : if test "x1.46" = "x"; then : _AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0" else _AX_BOOST_BASE_TONUMERICVERSION_req="1.46" fi _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\.[0-9]*\)'` _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\)'` if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"; then : as_fn_error $? "You should at least specify libboost major version" "$LINENO" 5 fi _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.\([0-9]*\)'` if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"; then : _AX_BOOST_BASE_TONUMERICVERSION_req_minor="0" fi _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'` if test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"; then : _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0" fi _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` WANT_BOOST_VERSION=$_AX_BOOST_BASE_TONUMERICVERSION_RET succeeded=no case ${host_cpu} in #( x86_64) : libsubdirs="lib64 libx32 lib lib64" ;; #( mips*64*) : libsubdirs="lib64 lib32 lib lib64" ;; #( ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64|e2k) : libsubdirs="lib64 lib lib64" ;; #( *) : libsubdirs="lib" ;; esac case ${host_cpu} in #( i?86) : multiarch_libsubdir="lib/i386-${host_os}" ;; #( armv7l) : multiarch_libsubdir="lib/arm-${host_os}" ;; #( *) : multiarch_libsubdir="lib/${host_cpu}-${host_os}" ;; esac if test "x$_AX_BOOST_BASE_boost_path" != "x"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.46 ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"" >&5 $as_echo_n "checking for boostlib >= 1.46 ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"... " >&6; } if test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.46 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"" >&5 $as_echo_n "checking for boostlib >= 1.46 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"... " >&6; } if test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; break; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi done else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else if test X"$cross_compiling" = Xyes; then search_libsubdirs=$multiarch_libsubdir else search_libsubdirs="$multiarch_libsubdir $libsubdirs" fi for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local /opt/homebrew ; do if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then for libsubdir in $search_libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" break; fi done fi if test "x$_AX_BOOST_BASE_boost_lib_path" != "x"; then : BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.46 ($WANT_BOOST_VERSION)" >&5 $as_echo_n "checking for boostlib >= 1.46 ($WANT_BOOST_VERSION)... " >&6; } CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))])); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes found_system=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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$succeeded" != "xyes" ; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then BOOST_LDFLAGS= fi _version=0 if test -n "$_AX_BOOST_BASE_boost_path" ; then if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" done if test -z "$BOOST_CPPFLAGS"; then if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" fi fi if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then for libsubdir in $libsubdirs ; do if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" fi fi else if test "x$cross_compiling" != "xyes" ; then for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local /opt/homebrew ; do if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp best_path=$_AX_BOOST_BASE_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test -n "$BOOST_ROOT" ; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([0-9]*\.[0-9]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We will use a staged boost library from $BOOST_ROOT" >&5 $as_echo "$as_me: We will use a staged boost library from $BOOST_ROOT" >&6;} BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))])); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes found_system=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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 fi if test "x$succeeded" != "xyes" ; then if test "x$_version" = "x0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version 1.46 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&5 $as_echo "$as_me: We could not detect the boost libraries (version 1.46 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: Your boost libraries seems to old (version $_version)." >&5 $as_echo "$as_me: Your boost libraries seems to old (version $_version)." >&6;} fi # execute ACTION-IF-NOT-FOUND (if present): as_fn_error $? "Boost Filesystem >= 1.46 is required. Please see INSTALL" "$LINENO" 5 else $as_echo "#define HAVE_BOOST /**/" >>confdefs.h # execute ACTION-IF-FOUND (if present): : fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi # Check whether --with-boost-system was given. if test "${with_boost_system+set}" = set; then : withval=$with_boost_system; if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_system_lib="" else want_boost="yes" ax_boost_user_system_lib="$withval" fi else want_boost="yes" fi if test "x$want_boost" = "xyes"; then CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Boost::System library is available" >&5 $as_echo_n "checking whether the Boost::System library is available... " >&6; } if ${ax_cv_boost_system+:} false; then : $as_echo_n "(cached) " >&6 else 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 CXXFLAGS_SAVE=$CXXFLAGS CXXFLAGS= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { boost::system::error_category *a = 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_boost_system=yes else ax_cv_boost_system=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS=$CXXFLAGS_SAVE 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_boost_system" >&5 $as_echo "$ax_cv_boost_system" >&6; } if test "x$ax_cv_boost_system" = "xyes"; then $as_echo "#define HAVE_BOOST_SYSTEM /**/" >>confdefs.h BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/[^\/]*//'` LDFLAGS_SAVE=$LDFLAGS if test "x$ax_boost_user_system_lib" = "x"; then for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do ax_lib=${libextension} as_ac_Lib=`$as_echo "ac_cv_lib_$ax_lib''_exit" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exit in -l$ax_lib" >&5 $as_echo_n "checking for exit in -l$ax_lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$ax_lib $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 exit (); int main () { return exit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : BOOST_SYSTEM_LIB="-l$ax_lib"; link_system="yes"; break else link_system="no" fi done if test "x$link_system" != "xyes"; then for libextension in `ls -r $BOOSTLIBDIR/boost_system* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do ax_lib=${libextension} as_ac_Lib=`$as_echo "ac_cv_lib_$ax_lib''_exit" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exit in -l$ax_lib" >&5 $as_echo_n "checking for exit in -l$ax_lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$ax_lib $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 exit (); int main () { return exit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : BOOST_SYSTEM_LIB="-l$ax_lib"; link_system="yes"; break else link_system="no" fi done fi else for ax_lib in $ax_boost_user_system_lib boost_system-$ax_boost_user_system_lib; do as_ac_Lib=`$as_echo "ac_cv_lib_$ax_lib''_exit" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exit in -l$ax_lib" >&5 $as_echo_n "checking for exit in -l$ax_lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$ax_lib $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 exit (); int main () { return exit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : BOOST_SYSTEM_LIB="-l$ax_lib"; link_system="yes"; break else link_system="no" fi done fi if test "x$ax_lib" = "x"; then as_fn_error $? "Could not find a version of the Boost::System library!" "$LINENO" 5 fi if test "x$link_system" = "xno"; then as_fn_error $? "Could not link against $ax_lib !" "$LINENO" 5 fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi # Check whether --with-boost-filesystem was given. if test "${with_boost_filesystem+set}" = set; then : withval=$with_boost_filesystem; if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_filesystem_lib="" else want_boost="yes" ax_boost_user_filesystem_lib="$withval" fi else want_boost="yes" fi if test "x$want_boost" = "xyes"; then CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS LIBS_SAVED=$LIBS LIBS="$LIBS $BOOST_SYSTEM_LIB" export LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Boost::Filesystem library is available" >&5 $as_echo_n "checking whether the Boost::Filesystem library is available... " >&6; } if ${ax_cv_boost_filesystem+:} false; then : $as_echo_n "(cached) " >&6 else 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { using namespace boost::filesystem; path my_path( "foo/bar/data.txt" ); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_boost_filesystem=yes else ax_cv_boost_filesystem=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_boost_filesystem" >&5 $as_echo "$ax_cv_boost_filesystem" >&6; } if test "x$ax_cv_boost_filesystem" = "xyes"; then $as_echo "#define HAVE_BOOST_FILESYSTEM /**/" >>confdefs.h BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/[^\/]*//'` if test "x$ax_boost_user_filesystem_lib" = "x"; then for libextension in `ls -r $BOOSTLIBDIR/libboost_filesystem* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do ax_lib=${libextension} as_ac_Lib=`$as_echo "ac_cv_lib_$ax_lib''_exit" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exit in -l$ax_lib" >&5 $as_echo_n "checking for exit in -l$ax_lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$ax_lib $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 exit (); int main () { return exit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : BOOST_FILESYSTEM_LIB="-l$ax_lib"; link_filesystem="yes"; break else link_filesystem="no" fi done if test "x$link_filesystem" != "xyes"; then for libextension in `ls -r $BOOSTLIBDIR/boost_filesystem* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do ax_lib=${libextension} as_ac_Lib=`$as_echo "ac_cv_lib_$ax_lib''_exit" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exit in -l$ax_lib" >&5 $as_echo_n "checking for exit in -l$ax_lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$ax_lib $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 exit (); int main () { return exit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : BOOST_FILESYSTEM_LIB="-l$ax_lib"; link_filesystem="yes"; break else link_filesystem="no" fi done fi else for ax_lib in $ax_boost_user_filesystem_lib boost_filesystem-$ax_boost_user_filesystem_lib; do as_ac_Lib=`$as_echo "ac_cv_lib_$ax_lib''_exit" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for exit in -l$ax_lib" >&5 $as_echo_n "checking for exit in -l$ax_lib... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$ax_lib $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 exit (); int main () { return exit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : BOOST_FILESYSTEM_LIB="-l$ax_lib"; link_filesystem="yes"; break else link_filesystem="no" fi done fi if test "x$ax_lib" = "x"; then as_fn_error $? "Could not find a version of the Boost::Filesystem library!" "$LINENO" 5 fi if test "x$link_filesystem" != "xyes"; then as_fn_error $? "Could not link against $ax_lib !" "$LINENO" 5 fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" LIBS="$LIBS_SAVED" fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" LIBS="$LIBS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB" # Check whether --enable-font-file was given. if test "${enable_font_file+set}" = set; then : enableval=$enable_font_file; gourcefontfile="$enableval" else gourcefontfile="" fi if test "x$gourcefontfile" != "x"; then FONTFILE_TRUE= FONTFILE_FALSE='#' else FONTFILE_TRUE='#' FONTFILE_FALSE= fi #see if ttf-font-dir option is enabled # Check whether --enable-ttf-font-dir was given. if test "${enable_ttf_font_dir+set}" = set; then : enableval=$enable_ttf_font_dir; gourcefontdir="$enableval" else gourcefontdir="" fi if test "x$gourcefontdir" != "x"; then FONTDIR_TRUE= FONTDIR_FALSE='#' else FONTDIR_TRUE='#' FONTDIR_FALSE= fi #GLM ac_fn_cxx_check_header_mongrel "$LINENO" "glm/glm.hpp" "ac_cv_header_glm_glm_hpp" "$ac_includes_default" if test "x$ac_cv_header_glm_glm_hpp" = xyes; then : else as_fn_error $? "GLM headers are required. Please see INSTALL" "$LINENO" 5 fi #see if building against system TinyXML library use_tinyxml_system_library=no # Check whether --with-tinyxml was given. if test "${with_tinyxml+set}" = set; then : withval=$with_tinyxml; use_tinyxml_system_library=$withval fi if test "x$use_tinyxml_system_library" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ltinyxml" >&5 $as_echo_n "checking for main in -ltinyxml... " >&6; } if ${ac_cv_lib_tinyxml_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltinyxml $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_tinyxml_main=yes else ac_cv_lib_tinyxml_main=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_tinyxml_main" >&5 $as_echo "$ac_cv_lib_tinyxml_main" >&6; } if test "x$ac_cv_lib_tinyxml_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBTINYXML 1 _ACEOF LIBS="-ltinyxml $LIBS" else as_fn_error $? "TinyXML library was requested but not found" "$LINENO" 5 fi ac_cv_lib_tinyxml=ac_cv_lib_tinyxml_main fi if test "x$use_tinyxml_system_library" != "xyes"; then USE_BUNDLED_TINYXML_TRUE= USE_BUNDLED_TINYXML_FALSE='#' else USE_BUNDLED_TINYXML_TRUE='#' USE_BUNDLED_TINYXML_FALSE= fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, 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}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.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 "${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__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 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 "${FONTFILE_TRUE}" && test -z "${FONTFILE_FALSE}"; then as_fn_error $? "conditional \"FONTFILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FONTDIR_TRUE}" && test -z "${FONTDIR_FALSE}"; then as_fn_error $? "conditional \"FONTDIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_BUNDLED_TINYXML_TRUE}" && test -z "${USE_BUNDLED_TINYXML_FALSE}"; then as_fn_error $? "conditional \"USE_BUNDLED_TINYXML\" 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 Gource $as_me 0.54, 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 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" 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 Configuration files: $config_files 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="\\ Gource config.status 0.54 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;; --he | --h | --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" MAKE="${MAKE-make}" _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 "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) 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_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" eval set X " :F $CONFIG_FILES :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 ;; :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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; 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 $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; 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 gource-0.54/src/0000755002342600234260000000000014362112042013350 5ustar andrewcandrewcgource-0.54/src/dirnode.cpp0000644002342600234260000007517214362112040015512 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "dirnode.h" float gGourceMinDirSize = 15.0; float gGourceForceGravity = 10.0; float gGourceDirPadding = 1.5; bool gGourceNodeDebug = false; bool gGourceGravity = true; //debugging int gGourceDirNodeInnerLoops = 0; int gGourceFileInnerLoops = 0; std::map gGourceDirMap; RDirNode::RDirNode(RDirNode* parent, const std::string & abspath) { changePath(abspath); parent = 0; setParent(parent); accel = spos = prev_accel = vel = vec2(0.0f); //NOTE: parent is always being set to 0 so this never gets called ... //figure out starting position if(parent !=0) { vec2 parentPos = parent->getPos(); vec2 offset; pos = parentPos; } else { pos = vec2(0.0f, 0.0f); } float padded_file_radius = gGourceFileDiameter * 0.5; file_area = padded_file_radius * padded_file_radius * PI; visible_count = 0; visible = false; position_initialized = false; since_node_visible = 0.0; since_last_file_change = 0.0; since_last_node_change = 0.0; calcRadius(); calcColour(); } void RDirNode::changePath(const std::string & abspath) { //fix up path gGourceDirMap.erase(this->abspath); this->abspath = abspath; if(abspath.empty() || abspath[abspath.size()-1] != '/') { this->abspath += std::string("/"); } //debugLog("new dirnode %s\n", abspath.c_str()); gGourceDirMap[this->abspath] = this; } RDirNode::~RDirNode() { for(std::list::iterator it = children.begin(); it != children.end(); it++) { delete (*it); } gGourceDirMap.erase(abspath); } int RDirNode::getTokenOffset() const{ return path_token_offset; } void RDirNode::fileUpdated(bool userInitiated) { calcRadius(); since_last_file_change = 0.0; nodeUpdated(userInitiated); } void RDirNode::nodeUpdated(bool userInitiated) { if(userInitiated) since_last_node_change = 0.0; calcRadius(); updateFilePositions(); if(visible && noDirs() && noFiles()) visible = false; if(parent !=0) parent->nodeUpdated(true); } void RDirNode::rotate(float s, float c) { pos = rotate_vec2(pos, s, c); spos = rotate_vec2(spos, s, c); for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* child = (*it); child->rotate(s, c); } } void RDirNode::rotate(float s, float c, const vec2& centre) { pos = rotate_vec2(pos - centre, s, c) + centre; spos = rotate_vec2(spos - centre, s, c) + centre; for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* child = (*it); child->rotate(s, c, centre); } } void RDirNode::setPos(const vec2 & pos) { this->pos = pos; } //returns true if supplied path prefixes the nodes path bool RDirNode::prefixedBy(const std::string & path) const { if(path.empty()) return false; if(path[path.size()-1] != '/') return abspath.find(path + std::string("/")) == 0; else return abspath.find(path) == 0; } const std::string & RDirNode::getPath() const{ return abspath; } RDirNode* RDirNode::getParent() const{ return parent; } bool RDirNode::isDir(const std::string& path) const { if(prefixedBy(path)) return true; if(path.find(abspath) != 0) return false; for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { if((*it)->isDir(path)) return true; } return false; } //finds directories closest to the root directory prefixed by path (eg foo/ may match just foo/ or could also match foo/bar1, foo/bar2, ... if foo/ doesn't exist). void RDirNode::findDirs(const std::string& path, std::list& dirs) { if(prefixedBy(path)) { dirs.push_back(this); return; } for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { (*it)->findDirs(path, dirs); } } void RDirNode::getFilesRecursive(std::list& files) const { //add this dirs files files.insert(files.begin(), this->files.begin(), this->files.end()); for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { (*it)->getFilesRecursive(files); } } int RDirNode::getDepth() const{ return depth; } void RDirNode::adjustPath() { //update display path int parent_token_offset = 0; path_token_offset = abspath.size(); if(parent != 0) { parent_token_offset = parent->getTokenOffset(); //debugLog("abspath.substr arguments: %d %d %s size = %d\n", parent_token_offset, abspath.size()-parent_token_offset-1, abspath.c_str(), abspath.size()); path_token = abspath.substr(parent_token_offset, abspath.size()-parent_token_offset-1); path_token_offset = abspath.size(); //debugLog("new token %s\n", path_token.c_str()); } } void RDirNode::setParent(RDirNode* parent) { if(parent != 0 && this->parent == parent) return; this->parent = parent; adjustPath(); adjustDepth(); } void RDirNode::adjustDepth() { if(parent == 0) { depth = 1; } else { depth = parent->getDepth() + 1; } for(RDirNode* child : children) { child->adjustDepth(); } } void RDirNode::addNode(RDirNode* node) { // does this node prefix any other nodes, if so, add them to it std::vector matches; std::string path = node->getPath(); //debugLog("adding node %s to %s\n", path.c_str(), abspath.c_str()); for(std::list::iterator it = children.begin(); it != children.end(); ) { RDirNode* child = (*it); if(child->prefixedBy(path)) { it = children.erase(it); node->addNode(child); } else { it++; } } // add to this node children.push_back(node); node->setParent(this); //debugLog("added node %s to %s\n", node->getPath().c_str(), getPath().c_str()); nodeUpdated(false); } RDirNode* RDirNode::getRoot() { if(parent==0) return this; return parent->getRoot(); } // note - you still need to delete the file yourself bool RDirNode::removeFile(RFile* f) { //doesnt match this path at all if(f->path.find(abspath) != 0) { return false; } //is this dir - add to this node if(f->path.compare(abspath) == 0) { for(std::list::iterator it = files.begin(); it != files.end(); it++) { if((*it)==f) { files.erase(it); if(!f->isHidden()) visible_count--; fileUpdated(false); return true; } } return false; } //does this belong to one of the children ? for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); bool removed = node->removeFile(f); if(removed) { //fprintf(stderr, "%s file removed from a child. child file count=%d, dir count =%d\n", getPath().c_str(), node->fileCount(), node->dirCount()); //node->printFiles(); //node is now empty, reap! if(node->noFiles() && node->noDirs()) { children.erase(it); //fprintf(stderr, "deleting node %s from %s\n", node->getPath().c_str(), getPath().c_str()); delete node; nodeUpdated(false); } return true; } } return false; } void RDirNode::printFiles() { for(std::list::iterator it = files.begin(); it != files.end(); it++) { RFile* file = (*it); fprintf(stderr, "%s: %s %s\n", getPath().c_str(), file->fullpath.c_str() , file->isHidden() ? "hidden " : ""); } } void RDirNode::addVisible() { visible_count++; visible = true; } bool RDirNode::isVisible() { if(visible) return true; for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { if((*it)->isVisible()) { visible = true; return true; } } return false; } int RDirNode::visibleFileCount() const{ return visible_count; } int RDirNode::fileCount() const{ return files.size(); } bool RDirNode::noFiles() const{ return files.empty(); } std::string RDirNode::commonPathPrefix(const std::string & str) const{ size_t c = 0; int slash = -1; while(cpath.find(abspath) != 0) { if(parent != 0) return false; //if this is the root node (ie no parent), we fork it //if we encounter a file with a non matching path to the //current root path. the calling process then checks if //the root now has a parent node, and changes the pointer. RDirNode* newparent; std::string common = commonPathPrefix(f->path); if(common.size()==0) common = "/"; newparent = new RDirNode(0, common); newparent->addNode(this); return newparent->addFile(f); } //simply change path of node and add this to it if( parent==0 && abspath == "/" && f->path.compare(abspath) != 0 && noFiles() && noDirs()) { debugLog("modifying root path to %s", f->path.c_str()); changePath(f->path); } //is this dir - add to this node if(f->path.compare(abspath) == 0) { //debugLog("addFile %s to %s\n", f->fullpath.c_str(), abspath.c_str()); files.push_back(f); if(!f->isHidden()) visible_count++; f->setDir(this); fileUpdated(false); return true; } bool added = false; //does this belong to one of the children ? for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* child = (*it); added = child->addFile(f); if(added) break; } if(added && parent != 0) return true; //do we have a file in this directory thats fullpath is a prefix of this file, if so //that file is actually a directory - the file should be removed, and a directory with that path added //if this is the root node we do this regardless of if the file was added to a child node for(std::list::const_iterator it = files.begin(); it != files.end(); it++) { RFile* file = (*it); if(f->path.find(file->fullpath) == 0) { //fprintf(stderr, "removing %s as is actually the directory of %s\n", file->fullpath.c_str(), f->fullpath.c_str()); file->remove(); break; } } if(added) return true; //add new child, add it to that //if commonpath is longer than abspath, add intermediate node, else just add at the files path RDirNode* node = new RDirNode(this, f->path); node->addFile(f); addNode(node); // do we have dir nodes, with a common path element greater than abspath, // if so create another node, and move those nodes there std::string commonpath; vec2 commonPos; for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* child = (*it); std::string common = child->commonPathPrefix(f->path); if(common.size() > abspath.size() && common != f->path) { commonpath = common; commonPos = child->getPos(); break; } } // redistribute to new common node if(commonpath.size() > abspath.size()) { //debugLog("common path %s\n", commonpath.c_str()); RDirNode* cnode = new RDirNode(this, commonpath); cnode->setPos(commonPos); for(std::list::iterator it = children.begin(); it != children.end();) { RDirNode* child = (*it); if(child->prefixedBy(commonpath)) { //debugLog("this path = %s, commonpath = %s, path = %s\n", abspath.c_str(), commonpath.c_str(), child->getPath().c_str()); it = children.erase(it); cnode->addNode(child); continue; } it++; } addNode(cnode); } return true; } float RDirNode::getParentRadius() const{ return parent_radius; } float RDirNode::getRadius() const{ return dir_radius; } float RDirNode::getRadiusSqrt() const{ return dir_radius_sqrt; } vec3 RDirNode::averageFileColour() const{ vec3 av; int count = 0; for(std::list::const_iterator it = files.begin(); it != files.end(); it++) { RFile* file = (*it); if(file->isHidden()) continue; av += file->getColour(); count++; } if(count>0) av *= (1.0f/(float)count); count = 0; for(std::list::const_iterator it = children.begin(); it != children.end();it++) { RDirNode* child = (*it); av += child->averageFileColour(); count++; } if(count>0) av *= (1.0f/(float)count); return av; } const vec4 & RDirNode::getColour() const{ return col; } void RDirNode::calcColour() { // make branch brighter if recently accessed float brightness = std::max(0.6f, 1.0f - std::min(1.0f, since_last_node_change / 3.0f)); col = vec4(brightness, brightness, brightness, 1.0); int fcount = 0; for(std::list::iterator it = files.begin(); it != files.end(); it++) { RFile* file = (*it); if(file->isHidden()) continue;; vec3 filecol = file->getColour() * brightness; float a = file->getAlpha(); col += vec4(filecol.x, filecol.y, filecol.z, a); fcount++; } this->col /= (float) fcount + 1.0; } float RDirNode::getArea() const{ return dir_area; } void RDirNode::calcRadius() { float total_file_area = file_area * visible_count; dir_area = total_file_area; //float parent_circ = 0.0; for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); dir_area += node->getArea(); // parent_circ += node->getRadiusSqrt(); } this->dir_radius = std::max(1.0f, (float)sqrt(dir_area)) * gGourceDirPadding; //this->dir_radius_sqrt = sqrt(dir_radius); //dir_radius_sqrt is not used // this->parent_radius = std::max(1.0, parent_circ / PI); this->parent_radius = std::max(1.0f, (float) sqrt(total_file_area) * gGourceDirPadding); } float RDirNode::distanceToParent() const{ float posd = glm::length(parent->getPos() - pos); float distance = posd - (dir_radius + parent->getParentRadius()); return distance; } void RDirNode::applyForceDir(RDirNode* node) { if(node == this) return; vec2 dir = node->getPos() - pos; float posd2 = glm::length2(dir); float myradius = getRadius(); float your_radius = node->getRadius(); float sumradius = (myradius + your_radius); float distance2 = posd2 - sumradius*sumradius; if(distance2>0.0) return; float posd = sqrt(posd2); float distance = posd - myradius - your_radius; //resolve overlap if(posd < 0.00001) { accel += normalise(vec2( (rand() % 100) - 50, (rand() % 100) - 50)); return; } accel += distance * normalise(dir); } const vec2 & RDirNode::getPos() const{ return pos; } bool RDirNode::isParent(RDirNode* node) const { if(node==parent) return true; if(parent==0) return false; return parent->isParent(node); } bool RDirNode::empty() const{ return (visible_count==0 && noDirs()) ? true : false; } void RDirNode::applyForces(QuadTree & quadtree) { //child nodes for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->applyForces(quadtree); } if(parent == 0) return; DirForceFunctor dff(this); quadtree.visitItemsInBounds(quadItemBounds, dff); gGourceDirNodeInnerLoops += dff.getLoopCount(); //always call on parent no matter how far away applyForceDir(parent); //pull towards parent float parent_dist = distanceToParent(); // * dirs should attract to sit on the radius of the parent dir ie: // should attract to distance_to_parent * normal_to_parent accel += gGourceForceGravity * parent_dist * normalise(parent->getPos() - pos); // * dirs should be pushed along the parent_parent to parent normal by a force smaller than the parent radius force RDirNode* pparent = parent->getParent(); if(pparent != 0) { vec2 parent_edge = (parent->getPos() - pparent->getPos()); vec2 parent_edge_normal = normalise(parent_edge); vec2 dest = (parent->getPos() + (parent->getRadius() + getRadius()) * parent_edge_normal) - pos; accel += dest; } // * dirs should repulse from other dirs of this parent const std::list & siblings = parent->getChildren(); if(!siblings.empty()) { vec2 sib_accel; int visible = 1; for(std::list::const_iterator it = siblings.begin(); it != siblings.end(); it++) { RDirNode* node = (*it); if(node == this) continue; if(!node->isVisible()) continue; visible++; sib_accel -= normalise(node->getPos() - pos); } //parent circumfrence divided by the number of visible child nodes if(visible>1) { float slice_size = (parent->getRadius() * PI) / (float) (visible+1); sib_accel *= slice_size; accel += sib_accel; } } } void RDirNode::debug(int indent) const{ std::string indentstr; while(indentstr.size() < indent) indentstr += " "; debugLog("%s%s", indentstr.c_str(), abspath.c_str()); for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->debug(indent+1); } } int RDirNode::totalFileCount() const{ int total = visibleFileCount(); for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); total += node->visibleFileCount(); } return total; } int RDirNode::totalDirCount() const{ int total = 1; for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); total += node->totalDirCount(); } return total; } int RDirNode::dirCount() const{ return children.size(); } bool RDirNode::noDirs() const{ return children.empty(); } const std::list & RDirNode::getChildren() const{ return children; } void RDirNode::updateSplinePoint(float dt) { if(parent == 0) return; //update the spline point vec2 td = (parent->getPos() - pos) * 0.5f; vec2 mid = pos + td;// - td.perpendicular() * pos.normal();// * 10.0; vec2 delta = (mid - spos); //dont let spos get more than half the length of the distance behind if(glm::length2(delta) > glm::length2(td)) { spos += normalise(delta) * (glm::length(delta) - glm::length(td)); } spos += delta * std::min(1.0f, dt * 2.0f); } void RDirNode::setInitialPosition() { RDirNode* parentP = parent->getParent(); pos = parent->getPos(); //offset position by some pseudo-randomness if(parentP != 0) { //pos += ((parent->getPos() - parentP->getPos()).normal() * 2.0 + vec2Hash(abspath)).normal(); pos += normalise(normalise(parent->getPos() - parentP->getPos()) * 2.0f + vec2Hash(abspath)); } else { pos += vec2Hash(abspath); } //the spline point spos = pos - (parent->getPos() - pos) * 0.5f; position_initialized=true; } void RDirNode::move(float dt) { //the root node is the centre of the world if(parent == 0) { return; } //initial position if(!empty() && !position_initialized) { setInitialPosition(); } pos += accel * dt; if(gGourceSettings.elasticity>0.0) { vec2 diff = (accel - prev_accel); float m = dt * gGourceSettings.elasticity; vec2 accel3 = prev_accel * (1.0f-m) + diff * m; pos += accel3; prev_accel = accel3; } //accel = accel * std::max(0.0f, (1.0f - dt*10.0f)); accel = vec2(0.0, 0.0); } const vec2 & RDirNode::getNodeNormal() const{ return node_normal; } vec2 RDirNode::calcFileDest(int max_files, int file_no) { float arc = 1.0/(float)max_files; float frac = arc * 0.5 + arc * file_no; vec2 dest = vec2(sinf(frac*PI*2.0), cosf(frac*PI*2.0)); return dest; } void RDirNode::updateFilePositions() { int max_files = 1; int diameter = 1; int file_no = 0; float d = 0.0; int files_left = visible_count; for(std::list::iterator it = files.begin(); it!=files.end(); it++) { RFile* f = *it; if(f->isHidden()) { f->setDest(vec2(0.0,0.0)); f->setDistance(0.0f); continue; } vec2 dest = calcFileDest(max_files, file_no); f->setDest(dest); f->setDistance(d); files_left--; file_no++; if(file_no>=max_files) { diameter++; d += gGourceFileDiameter; max_files = (int) std::max(1.0, diameter*PI); if(files_leftgetProjectedPos(), parent->getColour(), projected_pos, col, projected_spos); } for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* child = *it; child->calcEdges(); } } void RDirNode::logic(float dt) { //move move(dt); updateSplinePoint(dt); //update node normal if(parent != 0) { node_normal = normalise(pos - parent->getPos()); } //update files for(std::list::iterator it = files.begin(); it!=files.end(); it++) { RFile* f = *it; f->logic(dt); } //update child nodes for(std::list::iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->logic(dt); } //update colour calcColour(); //update tickers if(visible) since_node_visible += dt; since_last_file_change += dt; since_last_node_change += dt; } void RDirNode::drawDirName(FXFont& dirfont) const{ if(parent==0) return; if(gGourceSettings.hide_dirnames) return; if(gGourceSettings.dir_name_depth > 0 && gGourceSettings.dir_name_depth < (depth-1)) return; if(!gGourceSettings.highlight_dirs && since_last_node_change > 5.0) return; float alpha = gGourceSettings.highlight_dirs ? 1.0 : std::max(0.0f, 5.0f - since_last_node_change) / 5.0f; vec2 label_pos = spline.getLabelPos(); dirfont.setAlpha(alpha); dirfont.draw(label_pos.x, label_pos.y, path_token); } void RDirNode::calcScreenPos(GLint* viewport, GLdouble* modelview, GLdouble* projection) { static GLdouble screen_x, screen_y, screen_z; gluProject( pos.x, pos.y, 0.0f, modelview, projection, viewport, &screen_x, &screen_y, &screen_z); screen_y = (float)viewport[3] - screen_y; projected_pos.x = screen_x; projected_pos.y = screen_y; gluProject( spos.x, spos.y, 0.0f, modelview, projection, viewport, &screen_x, &screen_y, &screen_z); screen_y = (float)viewport[3] - screen_y; projected_spos.x = screen_x; projected_spos.y = screen_y; static vec2 selected_offset(5.5f, -2.0f); static vec2 unselected_offset(5.5f, -1.0f); if(!gGourceSettings.hide_filenames) { //first pass - calculate positions of names for(std::list::const_iterator it = files.begin(); it!=files.end(); it++) { RFile* f = *it; f->calcScreenPos(viewport, modelview, projection); } } for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->calcScreenPos(viewport, modelview, projection); } } void RDirNode::drawNames(FXFont& dirfont) { if(!gGourceSettings.hide_dirnames && isVisible()) { drawDirName(dirfont); } if(!gGourceSettings.hide_filenames) { if(!(gGourceSettings.hide_filenames || gGourceSettings.hide_files) && in_frustum) { for(std::list::const_iterator it = files.begin(); it!=files.end(); it++) { RFile* f = *it; if(!f->isSelected()) f->drawName(); } } } for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->drawNames(dirfont); } } void RDirNode::checkFrustum(const Frustum& frustum) { in_frustum = frustum.intersects(quadItemBounds); for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->checkFrustum(frustum); } } void RDirNode::drawShadows(float dt) const{ if(in_frustum) { glPushMatrix(); glTranslatef(pos.x, pos.y, 0.0); //draw files for(std::list::const_iterator it = files.begin(); it!=files.end(); it++) { RFile* f = *it; if(f->isHidden()) continue; f->drawShadow(dt); } glPopMatrix(); } for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->drawShadows(dt); } } void RDirNode::updateFilesVBO(quadbuf& buffer, float dt) const{ if(in_frustum) { for(std::list::const_iterator it = files.begin(); it!=files.end(); it++) { RFile* f = *it; if(f->isHidden()) continue; vec3 col = f->getColour(); float alpha = f->getAlpha(); buffer.add(f->graphic->textureid, f->getAbsolutePos() - f->dims*0.5f, f->dims, vec4(col.x, col.y, col.z, alpha)); } } for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->updateFilesVBO(buffer,dt); } } void RDirNode::updateBloomVBO(bloombuf& buffer, float dt) { if(in_frustum && isVisible()) { float bloom_radius = dir_radius * 2.0 * gGourceSettings.bloom_multiplier; float bloom_diameter = bloom_radius * 2.0; vec4 bloom_col = col * gGourceSettings.bloom_intensity; vec4 bloom_texcoords(bloom_radius, pos.x, pos.y, 0.0f); vec2 bloom_dims(bloom_diameter, bloom_diameter); buffer.add(0, pos - bloom_dims*0.5f,bloom_dims, vec4(bloom_col.x, bloom_col.y, bloom_col.z, 1.0f), bloom_texcoords); } for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->updateBloomVBO(buffer,dt); } } void RDirNode::drawFiles(float dt) const{ if(in_frustum) { glPushMatrix(); glTranslatef(pos.x, pos.y, 0.0); //draw files for(std::list::const_iterator it = files.begin(); it!=files.end(); it++) { RFile* f = *it; if(f->isHidden()) continue; f->draw(dt); } glPopMatrix(); } for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->drawFiles(dt); } } const vec2 & RDirNode::getSPos() const{ return projected_spos; } const vec2 & RDirNode::getProjectedPos() const{ return projected_pos; } void RDirNode::updateEdgeVBO(quadbuf& buffer) const { if(parent!=0 && (!gGourceSettings.hide_root || parent->parent !=0)) spline.drawToVBO(buffer); for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* child = (*it); if(child->isVisible()) { child->updateEdgeVBO(buffer); } } } void RDirNode::drawEdgeShadows() const{ if(parent!=0 && (!gGourceSettings.hide_root || parent->parent !=0)) spline.drawShadow(); for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* child = (*it); //draw edge - assumes calcEdges() called before hand so spline will exist if(child->isVisible()) { child->drawEdgeShadows(); } } } void RDirNode::drawEdges() const{ if(parent!=0 && (!gGourceSettings.hide_root || parent->parent !=0)) spline.draw(); for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* child = (*it); //draw edge - assumes calcEdges() called before hand so spline will exist if(child->isVisible()) { child->drawEdges(); } } } void RDirNode::drawBloom(float dt){ if(in_frustum && isVisible()) { float bloom_radius = dir_radius * 2.0 * gGourceSettings.bloom_multiplier; vec4 bloom_col = col * gGourceSettings.bloom_intensity; glColor4f(bloom_col.x, bloom_col.y, bloom_col.z, 1.0); glPushMatrix(); glTranslatef(pos.x, pos.y, 0.0); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex2f(bloom_radius,bloom_radius); glTexCoord2f(1.0f, 0.0f); glVertex2f(bloom_radius,-bloom_radius); glTexCoord2f(0.0f, 0.0f); glVertex2f(-bloom_radius,-bloom_radius); glTexCoord2f(0.0f, 1.0f); glVertex2f(-bloom_radius,bloom_radius); glEnd(); glPopMatrix(); } for(std::list::const_iterator it = children.begin(); it != children.end(); it++) { RDirNode* node = (*it); node->drawBloom(dt); } } void RDirNode::updateQuadItemBounds() { float radius = getRadius(); vec2 radoffset(radius, radius); //set bounds quadItemBounds.set(pos - radoffset, pos + radoffset); } gource-0.54/src/bloom.h0000644002342600234260000000313314362112040014627 0ustar andrewcandrewc/* Copyright (C) 2011 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef GOURCE_BLOOM_VBO_H #define GOURCE_BLOOM_VBO_H #include #include "core/display.h" #include "core/vectors.h" #include "core/logger.h" //note this should be 64 bytes class bloom_vertex { public: bloom_vertex() {}; bloom_vertex(const vec2& pos, const vec4& colour, const vec4& texcoord) : pos(pos), colour(colour), texcoord(texcoord) {}; vec2 pos; vec4 colour; vec4 texcoord; char padding[24]; }; class bloombuf { bloom_vertex* data; int data_size; GLuint bufferid; int buffer_size; int vertex_count; void resize(int new_size); public: bloombuf(int data_size = 0); ~bloombuf(); void unload(); void reset(); size_t vertices(); size_t capacity(); void add(GLuint textureid, const vec2& pos, const vec2& dims, const vec4& colour, const vec4& texcoord); void update(); void draw(); }; #endif gource-0.54/src/action.cpp0000644002342600234260000000742014362112040015332 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "action.h" RAction::RAction(RUser* source, RFile* target, time_t timestamp, float t, const vec3& colour) : colour(colour), source(source), target(target), timestamp(timestamp), t(t), progress(0.0f), rate(0.5f) { } void RAction::apply() { target->touch(timestamp, colour); } void RAction::logic(float dt) { if(progress >= 1.0) return; if(progress == 0.0) { apply(); } float action_rate = std::min(10.0f, rate * std::max(1.0f, ((float)source->getPendingActionCount()))); progress = std::min(progress + action_rate * dt, 1.0f); } void RAction::drawToVBO(quadbuf& buffer) const { if(isFinished()) return; vec2 src = source->getPos(); vec2 dest = target->getAbsolutePos(); //TODO: could use glm::perp vec2 n = normalise(dest - src); vec2 perp = vec2(-n.y, n.x); vec2 offset = perp * target->getSize() * 0.5f; vec2 offset_src = offset * 0.3f; float alpha = 1.0 - progress; float alpha2 = alpha * 0.1; vec4 col1 = vec4(colour, alpha); vec4 col2 = vec4(colour, alpha2); quadbuf_vertex v1(src - offset_src, col2, vec2(0.0f, 0.0f)); quadbuf_vertex v2(src + offset_src, col2, vec2(0.0f, 1.0f)); quadbuf_vertex v3(dest + offset, col1, vec2(1.0f, 1.0f)); quadbuf_vertex v4(dest - offset, col1, vec2(1.0f, 0.0f)); buffer.add(0, v1, v2, v3, v4); } void RAction::draw(float dt) { if(isFinished()) return; vec2 src = source->getPos(); vec2 dest = target->getAbsolutePos(); vec2 n = normalise(dest - src); vec2 perp = vec2(-n.y, n.x); vec2 offset = perp * target->getSize() * 0.5f; vec2 offset_src = offset * 0.3f; float alpha = 1.0 - progress; float alpha2 = alpha * 0.1; vec4 col1 = vec4(colour, alpha); vec4 col2 = vec4(colour, alpha2); glBegin(GL_QUADS); glColor4fv(glm::value_ptr(col2)); glTexCoord2f(0.0,0.0); glVertex2f(src.x - offset_src.x, src.y - offset_src.y); glTexCoord2f(0.0,1.0); glVertex2f(src.x + offset_src.x, src.y + offset_src.y); glColor4fv(glm::value_ptr(col1)); glTexCoord2f(1.0,1.0); glVertex2f(dest.x + offset.x, dest.y + offset.y); glTexCoord2f(1.0,0.0); glVertex2f(dest.x - offset.x, dest.y - offset.y); glEnd(); } CreateAction::CreateAction(RUser* source, RFile* target, time_t timestamp, float t) : RAction(source, target, timestamp, t, vec3(0.0f, 1.0f, 0.0f)) { } RemoveAction::RemoveAction(RUser* source, RFile* target, time_t timestamp, float t) : RAction(source, target, timestamp, t, vec3(1.0f, 0.0f, 0.0f)) { } void RemoveAction::logic(float dt) { float old_progress = progress; RAction::logic(dt); if(old_progress < 1.0 && progress >= 1.0) { target->remove(timestamp); } } ModifyAction::ModifyAction(RUser* source, RFile* target, time_t timestamp, float t, const vec3& modify_colour) : RAction(source, target, timestamp, t, vec3(1.0f, 0.7f, 0.3f)), modify_colour(modify_colour) { } void ModifyAction::apply() { RAction::apply(); target->setFileColour(modify_colour); } gource-0.54/src/caption.h0000644002342600234260000000242714362112040015161 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef RCAPTION_H #define RCAPTION_H #include "core/display.h" #include "core/fxfont.h" #include "gource_settings.h" class RCaption { float alpha; float elapsed; vec2 pos; vec3 colour; FXFont font; std::string caption; public: time_t timestamp; RCaption(const std::string& caption, time_t timestamp, const FXFont& font); void setPos(const vec2& pos); const vec2& getPos() const; const std::string& getCaption() const; bool isFinished() const; void logic(float dt); void draw(); }; #endif gource-0.54/src/zoomcamera.cpp0000644002342600234260000001053514362112040016213 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "zoomcamera.h" ZoomCamera::ZoomCamera() { } ZoomCamera::ZoomCamera(vec3 pos, vec3 target, float min_distance, float max_distance) : pos(pos), _pos(pos), target(target), _target(target), dest(pos), fov(90.0f) { znear = 0.1; up = vec3(0.0f, -1.0f, 0.0f); setMinDistance(min_distance); setMaxDistance(max_distance); padding = 1.0; speed = 1.0; lockon = false; lockon_time = 0.0; reset(); } void ZoomCamera::reset() { pos = _pos; target = _target; } float ZoomCamera::getMaxDistance() { return max_distance; } float ZoomCamera::getMinDistance() { return min_distance; } void ZoomCamera::setPadding(float padding) { this->padding = padding; } void ZoomCamera::setMaxDistance(float max) { max_distance = max; zfar = max + 1.0; } void ZoomCamera::setMinDistance(float min) { min_distance = min; } void ZoomCamera::lockOn(bool lockon) { if(lockon) { lockon_time = 1.0; } this->lockon = lockon; } void ZoomCamera::look() { lookAt(target); } void ZoomCamera::lookAt(const vec3& target) { gluLookAt( pos.x, pos.y, pos.z, target.x, target.y, target.z, up.x, up.y, up.z); } void ZoomCamera::focus() { display.mode3D(fov, znear, zfar); look(); } void ZoomCamera::stop() { this->dest = pos; } void ZoomCamera::setSpeed(float speed) { this->speed = speed; } void ZoomCamera::adjust(const Bounds2D& bounds) { adjust(bounds, true); } void ZoomCamera::adjust(const Bounds2D& bounds, bool adjust_distance) { //center camera on bounds vec2 centre = bounds.centre(); //adjust by screen ratio dest.x = centre.x; dest.y = centre.y; if(!adjust_distance) return; //scale by 10% so we dont have stuff right on the edge of the screen float width = bounds.width() * padding; float height = bounds.height() * padding; float aspect_ratio = display.width / (float) display.height; if(aspect_ratio < 1.0) { height /= aspect_ratio; } else { width /= aspect_ratio; } //calc visible width of the opposite wall at a distance of 1 this fov float toa = tan( fov * 0.5f * DEGREES_TO_RADIANS ) * 2.0; float distance; //TOA = tan = opposite/adjacent (distance = adjacent) //use the larger side of the box //cropping: vertical, horizontal or none if(gGourceSettings.crop_vertical) { distance = width / toa; } else if (gGourceSettings.crop_horizontal) { distance = height / toa; } else { if(width >= height) { distance = width / toa; } else { distance = height / toa; } } //debugLog("toa %.2f, distance %.2f width %.2f height %.2f dratio %.2f\n", toa, distance, width, height, dratio); //check bounds are valid if(distance < min_distance) distance = min_distance; if(distance > max_distance) distance = max_distance; this->dest.z = -distance; } void ZoomCamera::setDistance(float distance) { dest.z = -distance; } void ZoomCamera::setPos(const vec3& pos, bool keep_angle) { if(keep_angle) { vec3 dir = target - this->pos; this->pos = pos; this->target = pos + dir; } else { this->pos = pos; } } void ZoomCamera::logic(float dt) { vec3 dp = (dest - pos); vec3 dpt = dp * dt * speed; if(lockon) { dpt = dpt * lockon_time + dp * (1.0f-lockon_time); if(lockon_time>0.0) { lockon_time = std::max(0.0f, lockon_time-dt*0.5f); } } if(glm::length2(dpt) > glm::length2(dp)) dpt = dp; pos += dpt; target = vec3(pos.x, pos.y, 0.0); } gource-0.54/src/pawn.h0000644002342600234260000000461514362112040014472 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef PAWN_H #define PAWN_H #include #include "gource_settings.h" #include "core/display.h" #include "core/fxfont.h" #include "core/vectors.h" #include "core/quadtree.h" class Pawn : public QuadItem { protected: vec2 pos; vec2 shadowOffset; std::string name; float namewidth; vec2 accel; float speed; float elapsed; float fadetime; float nametime; float name_interval; vec3 namecol; bool shadow; bool hidden; int tagid; FXFont font; bool mouseover; virtual bool nameVisible() const; virtual void drawNameText(float alpha) {}; virtual const vec3& getNameColour() const; protected: bool selected; public: float size; float graphic_ratio; TextureResource* graphic; vec3 screenpos; vec2 dims; Pawn(const std::string& name, vec2 pos, int tagid); const vec2 & getPos() const { return pos; } void setPos(vec2 pos); void calcScreenPos(const vec2& offset); void updateQuadItemBounds(); void showName(); void setMouseOver(bool over); float getSize(); int getTagID(); const std::string& getName() const { return name; } virtual void setSelected(bool selected); bool isSelected() { return selected; }; void setHidden(bool hidden){ this->hidden = hidden; } bool isHidden() const { return hidden; } virtual float getAlpha() const{ return std::min(elapsed/fadetime, 1.0f); } virtual vec3 getColour() const { return vec3(1.0, 1.0, 1.0); } void setGraphic(TextureResource* graphic); void logic(float dt); void draw(float dt); void drawShadow(float dt); void drawName(); }; extern float gGourceShadowStrength; #endif gource-0.54/src/key.h0000644002342600234260000000417514362112040014316 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef FILE_KEY_H #define FILE_KEY_H #include "core/display.h" #include "core/vectors.h" #include "core/fxfont.h" #include "file.h" #include #include class FileKeyEntry { FXFont font; vec3 colour; std::string ext; std::string display_ext; float alpha; float brightness; int count; float pos_y; float src_y; float dest_y; float move_elapsed; float left_margin; float width; float height; vec2 pos; vec2 shadow; bool show; public: FileKeyEntry(const FXFont& font, const std::string& ext, const vec3& colour); const vec3& getColour() const; const std::string& getExt() const; void setDestY(float dest_y); void colourize(); void inc(); void dec(); void setShow(bool show); int getCount() const; void setCount(int count); bool isNew() const; bool isFinished() const; void logic(float dt); void draw(); }; class FileKey { std::vector active_keys; std::map keymap; FXFont font; float update_interval; float interval_remaining; bool show; public: FileKey(); ~FileKey(); FileKey(float update_interval); void setShow(bool show); void clear(); void colourize(); void inc(RFile* file); void dec(RFile* file); void logic(float dt); void draw(); }; #endif gource-0.54/src/user.h0000644002342600234260000000542514362112040014503 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef RUSER_H #define RUSER_H #include "gource_settings.h" #include "pawn.h" #include "action.h" #include "file.h" #include "sys/stat.h" #include class RAction; class RFile; class RUser : public Pawn { void assignUserImage(); std::list actions; std::list activeActions; size_t actionCount; size_t activeCount; float action_interval; float action_dist; float last_action; float min_units_ps; std::string name; vec3 usercol; bool highlighted; bool nameVisible() const; void updateFont(); const vec3& getNameColour() const; void drawNameText(float alpha); public: RUser(const std::string& name, vec2 pos, int tagid); vec3 getColour() const; void colourize(); const std::string& getName() const; void fileRemoved(RFile* f); void addAction(RAction* action); bool isIdle(); bool isFading(); bool isInactive(); void setSelected(bool selected); void setHighlighted(bool highlighted); int getActionCount(); int getPendingActionCount(); float getAlpha() const; void applyForceToActions(); void applyForceAction(RAction* action); void applyForceUser(RUser* u); void calcScreenPos(GLint* viewport, GLdouble* modelview, GLdouble* projection); void logic(float t, float dt); void updateActionsVBO(quadbuf& buffer); void drawActions(float dt); void draw(float dt); }; class UserForceFunctor : public VisitFunctor{ private: RUser * this_user; std::set seen; int loopCount; public: UserForceFunctor(RUser * user) : this_user(user), seen(), loopCount(0){} int getLoopCount() const{ return loopCount; } void operator()(QuadItem * user){ std::set::iterator seentest; RUser * b = (RUser*) (user); if(b==this_user) return; if(b->node_count != 1) { if((seentest = seen.find(b)) != seen.end()) return; seen.insert(b); } this_user->applyForceUser(b); loopCount++; } }; #endif gource-0.54/src/textbox.h0000644002342600234260000000306314362112040015216 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef TEXT_BOX_H #define TEXT_BOX_H #include #include #include "core/display.h" #include "core/vectors.h" #include "core/fxfont.h" class TextBox { std::vector content; vec3 colour; float alpha; float brightness; vec2 corner; vec2 shadow; FXFont font; int max_width_chars; int rect_width; int rect_height; bool visible; public: TextBox(); TextBox(const FXFont& font); void hide(); void show(); void clear(); void setPos(const vec2& pos, bool adjust = false); void setColour(const vec3& colour); void setAlpha(float alpha); void setBrightness(float brightness); void addLine(std::string str); void setText(const std::string& str); void setText(const std::vector& content); void draw() const; }; #endif gource-0.54/src/formats/0000755002342600234260000000000014362112041015022 5ustar andrewcandrewcgource-0.54/src/formats/custom.cpp0000644002342600234260000000544614362112040017050 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "custom.h" #include "../gource_settings.h" Regex custom_regex("^(?:\\xEF\\xBB\\xBF)?([^|]+)\\|([^|]*)\\|([ADM]?)\\|([^|]+)(?:\\|#?([a-fA-F0-9]{6}))?"); CustomLog::CustomLog(const std::string& logfile) : RCommitLog(logfile) { } vec3 CustomLog::parseColour(const std::string& cstr) { vec3 colour; int r,g,b; if(sscanf(cstr.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { colour = vec3( r, g, b ); colour /= 255.0f; } return colour; } // parse modified cvs format log entries bool CustomLog::parseCommit(RCommit& commit) { while(parseCommitEntry(commit)); return !commit.files.empty(); } bool CustomLog::parseCommitEntry(RCommit& commit) { std::string line; std::vector entries; if(!getNextLine(line)) return false; //custom line if(!custom_regex.match(line, &entries)) return false; time_t timestamp; // Allow timestamp to be a string if(entries[0].size() > 1 && entries[0].find("-", 1) != std::string::npos) { if(!SDLAppSettings::parseDateTime(entries[0], timestamp)) return false; } else { timestamp = (time_t) atoll(entries[0].c_str()); if(!timestamp && entries[0] != "0") return false; } std::string username = (entries[1].size()>0) ? entries[1] : "Unknown"; std::string action = (entries[2].size()>0) ? entries[2] : "A"; //if this file is for the same person and timestamp //we add to the commit, else we save the lastline //and return false if(commit.files.empty()) { commit.timestamp = timestamp; commit.username = username; } else { if(commit.timestamp != timestamp || commit.username != username) { lastline = line; return false; } } bool has_colour = false; vec3 colour; if(entries.size()>=5 && entries[4].size()>0) { has_colour = true; colour = parseColour(entries[4]); } if(has_colour) { commit.addFile(entries[3], action, colour); } else { commit.addFile(entries[3], action); } return true; } gource-0.54/src/formats/gitraw.h0000644002342600234260000000177114362112040016475 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef GITLOG_RAW_H #define GITLOG_RAW_H #include "commitlog.h" #include extern std::string gGourceGitRawLogCommand; class GitRawCommitLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); public: GitRawCommitLog(const std::string& logfile); }; #endif gource-0.54/src/formats/cvs2cl.h0000644002342600234260000000176314362112040016375 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef CVS2CL_H #define CVS2CL_H #include "commitlog.h" class CVS2CLCommitLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); std::string logentry; public: CVS2CLCommitLog(const std::string& logfile); static std::string logCommand(); }; #endif gource-0.54/src/formats/gitraw.cpp0000644002342600234260000000543014362112040017024 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "gitraw.h" Regex git_raw_commit("^commit ([0-9a-z]+)"); Regex git_raw_tree("^tree ([0-9a-z]+)"); Regex git_raw_parent("^parent ([0-9a-z]+)"); Regex git_raw_author("^author (.+) <([^@>]+)@?([^>]*)> (\\d+) ([-+]\\d+)"); Regex git_raw_committer("^committer (.+) <([^@>]+)@?([^>]*)> (\\d+) ([-+]\\d+)"); Regex git_raw_file("^:[0-9]+ [0-9]+ [0-9a-z]+\\.* ([0-9a-z]+)\\.* ([A-Z])[ \\t]+(.+)"); // parse git log entries // NOTE: this format is deprecated and exists // to allow existing log files produced in this format to work std::string gGourceGitRawLogCommand = "git log --reverse --raw --pretty=raw"; GitRawCommitLog::GitRawCommitLog(const std::string& logfile) : RCommitLog(logfile, 'c') { log_command = gGourceGitRawLogCommand; } bool GitRawCommitLog::parseCommit(RCommit& commit) { std::string line; std::vector entries; //read commit ref/ branch if(!logf->getNextLine(line)) return false; //commit if(!git_raw_commit.match(line, &entries)) return false; if(!logf->getNextLine(line)) return false; //tree if(!git_raw_tree.match(line, &entries)) return false; if(!logf->getNextLine(line)) return false; //0 or more parents while(git_raw_parent.match(line, &entries)) { if(!logf->getNextLine(line)) return false; } //author - used for display name if(!git_raw_author.match(line, &entries)) return false; commit.username = entries[0]; if(!logf->getNextLine(line)) return false; //committer - used for time (most likely cronological) if(!git_raw_committer.match(line, &entries)) return false; commit.timestamp = atol(entries[3].c_str()); //blank line before message if(!logf->getNextLine(line)) return false; //read commit message while(logf->getNextLine(line) && line.size()) { } //read files while(logf->getNextLine(line) && line.size()) { //debugLog("file??? %s\n", line.c_str()); if(git_raw_file.match(line, &entries)) { commit.addFile(entries[2], entries[1]); } } // commit.debug(); return true; } gource-0.54/src/formats/cvs-exp.cpp0000644002342600234260000001003314362112040017107 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "cvs-exp.h" Regex cvsexp_commitno_regex("^([0-9]{6}):"); Regex cvsexp_branch_regex("^BRANCH \\[(.+)\\]$"); Regex cvsexp_date_regex("^\\(date: ([0-9]{4})[-/]([0-9]{2})[-/]([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})(?: [+-][0-9]{4})?;(.+)$"); Regex cvsexp_detail_regex("author: ([^;]+); state: ([^;]+);(.+)$"); //Regex cvsexp_lines_regex("lines: \\+([0-9]+) -([0-9]+)"); Regex cvsexp_entry_regex("\\| (.+),v:([0-9.]+),?"); Regex cvsexp_end_regex("^(=+)$"); std::string CVSEXPCommitLog::logCommand() { std::string log_command = "cvs-exp.pl -notree"; return log_command; } CVSEXPCommitLog::CVSEXPCommitLog(const std::string& logfile) : RCommitLog(logfile) { } // parse modified cvs format log entries bool CVSEXPCommitLog::parseCommit(RCommit& commit) { std::string line; std::vector entries; if(!logf->getNextLine(line)) return false; //skip empty line if there is one if(line.size() == 0) { if(!logf->getNextLine(line)) return false; } //read commit no if(!cvsexp_commitno_regex.match(line, &entries)) return false; //int commitno = atoi(entries[0].c_str()); //debugLog("commitno matched\n"); if(!logf->getNextLine(line)) return false; //should be a branch if(cvsexp_branch_regex.match(line, &entries)) { //read next blank line if(!logf->getNextLine(line)) return false; if(line.size()) return false; if(!logf->getNextLine(line)) return false; } //parse date if(!cvsexp_date_regex.match(line, &entries)) return false; //debugLog("date matched\n"); struct tm time_str; time_str.tm_year = atoi(entries[0].c_str()) - 1900; time_str.tm_mon = atoi(entries[1].c_str()) - 1; time_str.tm_mday = atoi(entries[2].c_str()); time_str.tm_hour = atoi(entries[3].c_str()); time_str.tm_min = atoi(entries[4].c_str()); time_str.tm_sec = atoi(entries[5].c_str()); time_str.tm_isdst = -1; commit.timestamp = mktime(&time_str); //parse author,state std::string rest = entries[6]; if(!cvsexp_detail_regex.match(rest, &entries)) return false; //debugLog("author/state matched\n"); commit.username = entries[0]; std::string commit_state = entries[1]; /* not used //if rest is not ')' parse lines rest = entries[2]; // need to parse lines if(rest.size() > 2) { if(!cvsexp_lines_regex.match(rest, &entries)) return false; } */ if(!logf->getNextLine(line)) return false; std::string commit_action = (commit_state == "dead") ? "D" : "M"; while(cvsexp_entry_regex.match(line, &entries)) { //ignore files in Attic - previously deleted file if(entries[0].find("/Attic/") == std::string::npos) { commit.addFile(entries[0], commit_action); } if(!logf->getNextLine(line)) return false; } //read blank line if(!logf->getNextLine(line)) return false; //std::string message; //read commit message while(logf->getNextLine(line) && line.size()) { //if(message.size()) message += std::string("\n"); //message += line; } //read until end of commit or eof while(logf->getNextLine(line)) { if(cvsexp_end_regex.match(line,&entries)) { //debugLog("read end of commit %s\n", entries[0].c_str()); break; } } return true; } gource-0.54/src/formats/custom.h0000644002342600234260000000200314362112040016477 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef CUSTOMLOG_H #define CUSTOMLOG_H #include "commitlog.h" class CustomLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); bool parseCommitEntry(RCommit& commit); vec3 parseColour(const std::string& cstr); public: CustomLog(const std::string& logfile); }; #endif gource-0.54/src/formats/commitlog.cpp0000644002342600234260000002165214362112040017525 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "commitlog.h" #include "../gource_settings.h" #include "../core/sdlapp.h" #include "../core/utf8/utf8.h" std::string RCommitLog::filter_utf8(const std::string& str) { std::string filtered; try { utf8::replace_invalid(str.begin(), str.end(), back_inserter(filtered), '?'); } catch(...) { filtered = "???"; } return filtered; } //RCommitLog RCommitLog::RCommitLog(const std::string& logfile, int firstChar) { logf = 0; seekable = false; success = false; is_dir = false; buffered = false; if(logfile == "-") { //check first char if(checkFirstChar(firstChar, std::cin)) { logf = new StreamLog(); is_dir = false; seekable = false; success = true; } return; } struct stat fileinfo; int rc = stat(logfile.c_str(), &fileinfo); if(rc==0) { is_dir = (fileinfo.st_mode & S_IFDIR) ? true : false; if(!is_dir) { //check first char std::ifstream testf(logfile.c_str()); bool firstOK = checkFirstChar(firstChar, testf); testf.close(); if(firstOK) { logf = new SeekLog(logfile); seekable = true; success = true; } } } } RCommitLog::~RCommitLog() { if(logf!=0) delete logf; if(!temp_file.empty()) { remove(temp_file.c_str()); } } int RCommitLog::systemCommand(const std::string& command) { int rc = system(command.c_str()); return rc; } // TODO: implement check for 'nix OSs void RCommitLog::requireExecutable(const std::string& exename) { #ifdef _WIN32 TCHAR exePath[MAX_PATH]; DWORD result = SearchPath(0, exename.c_str(), ".exe", MAX_PATH, exePath, 0); if(result) return; throw SDLAppException("unable to find %s.exe", exename.c_str()); #endif } //check firstChar of stream is as expected. if no firstChar defined just returns true. bool RCommitLog::checkFirstChar(int firstChar, std::istream& stream) { //cant check this if(firstChar == -1) return true; int c = stream.peek(); if(firstChar == c) return true; return false; } bool RCommitLog::checkFormat() { if(!success) return false; //read a commit to see if the log is in the correct format if(nextCommit(lastCommit, false)) { if(seekable) { //if the log is seekable, go back to the start ((SeekLog*)logf)->seekTo(0.0); lastline.clear(); } else { //otherwise set the buffered flag as we have bufferd one commit buffered = true; } return true; } return false; } std::string RCommitLog::getLogCommand() { return log_command; } bool RCommitLog::isSeekable() { return seekable; } bool RCommitLog::getCommitAt(float percent, RCommit& commit) { if(!seekable) return false; SeekLog* seeklog = ((SeekLog*)logf); //save settings long currpointer = seeklog->getPointer(); std::string currlastline = lastline; seekTo(percent); bool success = findNextCommit(commit,500); //restore settings seeklog->setPointer(currpointer); lastline = currlastline; return success; } bool RCommitLog::getNextLine(std::string& line) { if(!lastline.empty()) { line = lastline; lastline.clear(); return true; } return logf->getNextLine(line); } void RCommitLog::seekTo(float percent) { if(!seekable) return; lastline.clear(); ((SeekLog*)logf)->seekTo(percent); } float RCommitLog::getPercent() { if(seekable) return ((SeekLog*)logf)->getPercent(); return 0.0; } bool RCommitLog::findNextCommit(RCommit& commit, int attempts) { for(int i=0;iisFinished()) return true; return false; } bool RCommitLog::hasBufferedCommit() { return buffered; } //create temp file bool RCommitLog::createTempLog() { return createTempFile(temp_file); } bool RCommitLog::createTempFile(std::string& temp_file) { std::string tempdir; #ifdef _WIN32 DWORD tmplen = GetTempPath(0, 0); if(tmplen == 0) return false; std::vector temp(tmplen+1); tmplen = GetTempPath(static_cast(temp.size()), &temp[0]); if(tmplen == 0 || tmplen >= temp.size()) return false; tempdir = std::string(temp.begin(), temp.begin() + static_cast(tmplen)); tempdir += "\\"; #else tempdir = "/tmp/"; #endif char tmplate[1024]; snprintf(tmplate, 1024, "%sgource-XXXXXX", tempdir.c_str()); #ifdef _WIN32 if(mktemp(tmplate) == NULL) return false; #else if(mkstemp(tmplate) < 0) return false; #endif temp_file = std::string(tmplate); return true; } // RCommitFile RCommitFile::RCommitFile(const std::string& filename, const std::string& action, vec3 colour) { this->filename = RCommitLog::filter_utf8(filename); //prepend a root slash if(this->filename[0] != '/') { this->filename.insert(0, 1, '/'); } this->action = action; this->colour = colour; } RCommit::RCommit() { timestamp = 0; } vec3 RCommit::fileColour(const std::string& filename) { size_t slash = filename.rfind('/'); size_t dot = filename.rfind('.'); if(dot != std::string::npos && dot+1::iterator ri = gGourceSettings.file_filters.begin(); ri != gGourceSettings.file_filters.end(); ri++) { Regex* r = *ri; if(r->match(filename)) { return; } } } // Only allow files that have been whitelisted if(!gGourceSettings.file_show_filters.empty()) { for(std::vector::iterator ri = gGourceSettings.file_show_filters.begin(); ri != gGourceSettings.file_show_filters.end(); ri++) { Regex* r = *ri; if(!r->match(filename)) { return; } } } files.push_back(RCommitFile(filename, action, colour)); } void RCommit::postprocess() { username = RCommitLog::filter_utf8(username); } bool RCommit::isValid() { //check user against filters, if found, discard commit if(!gGourceSettings.user_filters.empty()) { for(std::vector::iterator ri = gGourceSettings.user_filters.begin(); ri != gGourceSettings.user_filters.end(); ri++) { Regex* r = *ri; if(r->match(username)) { return false; } } } // Only allow users that have been whitelisted if(!gGourceSettings.user_show_filters.empty()) { for(std::vector::iterator ri = gGourceSettings.user_show_filters.begin(); ri != gGourceSettings.user_show_filters.end(); ri++) { Regex* r = *ri; if(!r->match(username)) { return false; } } } return !files.empty(); } void RCommit::debug() { debugLog("files:\n"); for(std::list::iterator it = files.begin(); it != files.end(); it++) { RCommitFile f = *it; debugLog("%s %s\n", f.action.c_str(), f.filename.c_str()); } } gource-0.54/src/formats/bzr.cpp0000644002342600234260000000661014362112040016325 0ustar andrewcandrewc/* Copyright (C) 2010 John Arbash Meinel This program is free software; you can 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 . */ #include "bzr.h" #include "../gource_settings.h" #include Regex bzr_commit_regex("^ *([\\d.]+) (.+)\t(\\d{4})-(\\d+)-(\\d+)(?: \\{[^}]+})?(?: \\[merge\\])?$"); Regex bzr_file_regex("^ *([AMDR]) (.*[^/])$"); // parse Bazaar log entries (using the gource.style template) std::string BazaarLog::logCommand() { std::string start = (!gGourceSettings.start_date.empty()) ? "date:"+gGourceSettings.start_date : "1"; std::string stop = (!gGourceSettings.stop_date.empty()) ? "date:"+gGourceSettings.stop_date : "-1"; std::string range = str(boost::format("%s..%s") % start % stop); std::string log_command = str(boost::format("bzr log --verbose -r %s --short -n0 --forward") % range); return log_command; } BazaarLog::BazaarLog(const std::string& logfile) : RCommitLog(logfile) { log_command = logCommand(); //can generate log from directory if(!logf && is_dir) { logf = generateLog(logfile); if(logf) { success = true; seekable = true; } } } BaseLog* BazaarLog::generateLog(const std::string& dir) { //does directory have a .bzr ? std::string bzrdir = dir + std::string("/.bzr"); struct stat dirinfo; int stat_rc = stat(bzrdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR)) { return 0; } std::string command = getLogCommand(); // do we have this client installed requireExecutable("bzr"); createTempLog(); if(temp_file.size()==0) return 0; char cmd_buff[2048]; snprintf(cmd_buff, 2048, "%s %s > %s", command.c_str(), dir.c_str(), temp_file.c_str()); int command_rc = systemCommand(cmd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; } bool BazaarLog::parseCommit(RCommit& commit) { std::string line; std::vector entries; int year, month, day; if(!logf->getNextLine(line)) return false; if (!bzr_commit_regex.match(line, &entries)) { //debugLog("regex failed\n"); return false; } commit.username = entries[1]; year = atoi(entries[2].c_str()); month = atoi(entries[3].c_str()); day = atoi(entries[4].c_str()); struct tm time_str; time_str.tm_year = year - 1900; time_str.tm_mon = month - 1; time_str.tm_mday = day; time_str.tm_hour = 0; time_str.tm_min = 0; time_str.tm_sec = 0; time_str.tm_isdst = -1; commit.timestamp = mktime(&time_str); while(logf->getNextLine(line) && line.size()) { if (!bzr_file_regex.match(line, &entries)) continue; commit.addFile(entries[1], entries[0]); } return true; } gource-0.54/src/formats/apache.cpp0000644002342600234260000000712614362112040016754 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "apache.h" #include const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug" , "Sep", "Oct", "Nov", "Dec" }; Regex apache_entry_start("^(?:[^ ]+ )?([^ ]+) +[^ ]+ +([^ ]+) +\\[(.*?)\\] +(.*)$"); Regex apache_entry_date("(\\d+)/([A-Za-z]+)/(\\d+):(\\d+):(\\d+):(\\d+) ([+-])(\\d+)"); Regex apache_entry_request("\"([^ ]+) +([^ ]+) +([^ ]+)\" +([^ ]+) +([^\\s+]+)(.*)"); Regex apache_entry_agent(" +\"([^\"]+)\" +\"([^\"]+)\" +\"([^\"]+)\""); Regex apache_hostname_parts("([^.]+)(?:\\.([^.]+))?(?:\\.([^.]+))?(?:\\.([^.]+))?(?:\\.([^.]+))?(?:\\.([^.]+))?(?:\\.([^.]+))?(?:\\.([^.]+))?$"); ApacheCombinedLog::ApacheCombinedLog(const std::string& logfile) : RCommitLog(logfile) { } //parse apache access.log entry into components bool ApacheCombinedLog::parseCommit(RCommit& commit) { std::string line; std::vector matches; if(!logf->getNextLine(line)) return false; apache_entry_start.match(line, &matches); if(matches.size()!=4) { return 0; } //get details commit.username = matches[0]; std::string request_str = matches[3]; std::string datestr = matches[2]; apache_entry_date.match(datestr, &matches); if(matches.size()!=8) { return 0; } //parse timestamp int day = atoi(matches[0].c_str()); int year = atoi(matches[2].c_str()); int hour = atoi(matches[3].c_str()); int minute = atoi(matches[4].c_str()); int second = atoi(matches[5].c_str()); int month=0; for(int i=0;i<12;i++) { if(matches[1] == months[i]) { month=i; break; } } struct tm time_str; time_str.tm_year = year - 1900; time_str.tm_mon = month; time_str.tm_mday = day; time_str.tm_hour = hour; time_str.tm_min = minute; time_str.tm_sec = second; time_str.tm_isdst = -1; commit.timestamp = mktime(&time_str); matches.clear(); apache_entry_request.match(request_str, &matches); if(matches.size() < 5) { return false; } std::string rtype = matches[0]; std::string file = matches[1]; std::string proto = matches[2]; int code = atoi(matches[3].c_str()); int bytes = atol(matches[4].c_str()); //remove args from url size_t argpos = file.rfind("?"); if(argpos != std::string::npos) { file = file.substr(0,argpos); } if(file.size()==0) file = "/"; //name index pages if(file[file.size()-1] == '/') { file += "index.html"; } std::string action = "A"; commit.addFile(file, action); std::string refer; std::string agent; if(matches.size() > 5) { std::string agentstr = matches[5]; matches.clear(); apache_entry_agent.match(agentstr, &matches); if(matches.size()>1) { refer = matches[0]; agent = matches[1]; } } return true; } gource-0.54/src/formats/bzr.h0000644002342600234260000000201314362112040015763 0ustar andrewcandrewc/* Copyright (C) 2010 John Arbash Meinel This program is free software; you can 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 . */ #ifndef BAZAARLOG_H #define BAZAARLOG_H #include "commitlog.h" class BazaarLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); BaseLog* generateLog(const std::string& dir); public: BazaarLog(const std::string& logfile); static std::string logCommand(); }; #endif gource-0.54/src/formats/svn.h0000644002342600234260000000213514362112040016001 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef SVNLOG_H #define SVNLOG_H #include "commitlog.h" #include extern std::string gGourceSVNLogCommand; class SVNCommitLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); BaseLog* generateLog(const std::string& dir); std::string logentry; public: SVNCommitLog(const std::string& logfile); static std::string logCommand(); }; #endif gource-0.54/src/formats/apache.h0000644002342600234260000000200514362112040016410 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef GOURCE_APACHE_H #define GOURCE_APACHE_H #include #include "commitlog.h" class ApacheCombinedLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); BaseLog* generateLog(const std::string& dir); public: ApacheCombinedLog(const std::string& logfile); }; #endif gource-0.54/src/formats/commitlog.h0000644002342600234260000000534514362112040017173 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef RCOMMIT_LOG_H #define RCOMMIT_LOG_H #include "../core/seeklog.h" #include "../core/display.h" #include "../core/regex.h" #include "../core/stringhash.h" #include #include #include #include "sys/stat.h" class RCommitFile { public: std::string filename; std::string action; vec3 colour; RCommitFile(const std::string& filename, const std::string& action, vec3 colour); }; class RCommit { vec3 fileColour(const std::string& filename); public: time_t timestamp; std::string username; std::list files; void postprocess(); bool isValid(); void addFile(const std::string& filename, const std::string& action); void addFile(const std::string& filename, const std::string& action, const vec3& colour); RCommit(); void debug(); virtual bool parse(BaseLog* logf) { return false; }; }; class RCommitLog { protected: BaseLog* logf; std::string temp_file; std::string log_command; std::string lastline; bool is_dir; bool success; bool seekable; RCommit lastCommit; bool buffered; bool checkFirstChar(int firstChar, std::istream& stream); bool createTempLog(); static bool createTempFile(std::string& temp_file); bool getNextLine(std::string& line); virtual bool parseCommit(RCommit& commit) { return false; }; public: RCommitLog(const std::string& logfile, int firstChar = -1); virtual ~RCommitLog(); static std::string filter_utf8(const std::string& str); void seekTo(float percent); bool checkFormat(); std::string getLogCommand(); static int systemCommand(const std::string& command); void requireExecutable(const std::string& exename); void bufferCommit(RCommit& commit); bool getCommitAt(float percent, RCommit& commit); bool findNextCommit(RCommit& commit, int attempts); bool nextCommit(RCommit& commit, bool validate = true); bool hasBufferedCommit(); bool isFinished(); bool isSeekable(); float getPercent(); }; #endif gource-0.54/src/formats/hg.h0000644002342600234260000000207314362112040015572 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef MERCURIALLOG_H #define MERCURIALLOG_H #include "commitlog.h" class MercurialLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); bool parseCommitEntry(RCommit& commit); BaseLog* generateLog(const std::string& dir); public: MercurialLog(const std::string& logfile); static std::string logCommand(); }; #endifgource-0.54/src/formats/git.cpp0000644002342600234260000001363114362112040016314 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "git.h" #include "../gource_settings.h" #ifndef _MSC_VER #include #endif // parse git log entries //git-log command notes: // - no single quotes on WIN32 as system call treats them differently // - 'user:' prefix allows us to quickly tell if the log is the wrong format // and try a different format (eg cvs-exp) int git_version_major = 0; int git_version_minor = 0; int git_version_patch = 0; Regex git_version_regex("([0-9]+)(?:\\.([0-9]+))?(?:\\.([0-9]+))?"); void GitCommitLog::readGitVersion() { if(git_version_major != 0) return; std::string temp_file; if(!createTempFile(temp_file)) { return; } char cmd_buff[2048]; int result = snprintf(cmd_buff, sizeof(cmd_buff), "git --version > %s", temp_file.c_str()); if(result < 0 || result >= sizeof(cmd_buff)) { remove(temp_file.c_str()); return; } int command_rc = systemCommand(cmd_buff); if(command_rc != 0) { remove(temp_file.c_str()); return; } std::ifstream in(temp_file.c_str()); if(!in.is_open()) { remove(temp_file.c_str()); return; } std::string version_str; std::getline(in, version_str); in.close(); remove(temp_file.c_str()); std::vector entries; if(!git_version_regex.match(version_str, &entries)) return; git_version_major = atoi(entries[0].c_str()); if(entries.size() > 1) { git_version_minor = atoi(entries[1].c_str()); } if(entries.size() > 2) { git_version_patch = atoi(entries[2].c_str()); } } std::string GitCommitLog::logCommand() { std::string log_command = "git log " "--pretty=format:user:%aN%n%ct " "--reverse --raw --encoding=UTF-8 " "--no-renames"; readGitVersion(); // Add --no-show-signature either // if git version couldn't be determined or if version // is at least 2.10 if( git_version_major == 0 || git_version_major > 2 || (git_version_major == 2 && git_version_minor >= 10)) { log_command.append(" --no-show-signature"); } if(!gGourceSettings.start_date.empty()) { log_command += " --since "; log_command += gGourceSettings.start_date; } if(!gGourceSettings.stop_date.empty()) { log_command += " --until "; log_command += gGourceSettings.stop_date; } if(!gGourceSettings.git_branch.empty()) { log_command += " "; log_command += gGourceSettings.git_branch; } return log_command; } GitCommitLog::GitCommitLog(const std::string& logfile) : RCommitLog(logfile, 'u') { log_command = logCommand(); //can generate log from directory if(!logf && is_dir) { logf = generateLog(logfile); if(logf) { success = true; seekable = true; } } } BaseLog* GitCommitLog::generateLog(const std::string& dir) { //get working directory char cwd_buff[1024]; if(getcwd(cwd_buff, 1024) != cwd_buff) { return 0; } //does directory have a .git ? std::string gitdir = dir + std::string("/.git"); struct stat dirinfo; int stat_rc = stat(gitdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR || dirinfo.st_mode & S_IFREG)) { return 0; } // do we have this client installed requireExecutable("git"); std::string command = getLogCommand(); //create temp file createTempLog(); if(temp_file.size()==0) return 0; if(chdir(dir.c_str()) != 0) { return 0; } char cmd_buff[2048]; int written = snprintf(cmd_buff, 2048, "%s > %s", command.c_str(), temp_file.c_str()); if(written < 0 || written >= 2048) { return 0; } int command_rc = systemCommand(cmd_buff); //change back to original directory chdir(cwd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; } // parse modified git format log entries bool GitCommitLog::parseCommit(RCommit& commit) { std::string line; commit.username = ""; while(logf->getNextLine(line) && line.size()) { if(line.find("user:") == 0) { //username follows user prefix commit.username = line.substr(5); if(!logf->getNextLine(line)) return false; commit.timestamp = atol(line.c_str()); //this isnt a commit we are parsing, abort if(commit.timestamp == 0) return false; continue; } //should see username before files if(commit.username.empty()) return false; size_t tab = line.find('\t'); //incorrect log format if(tab == std::string::npos || tab == 0 || tab == line.size()-1) continue; std::string status = line.substr(tab - 1, 1); std::string file = line.substr(tab + 1); if(file.empty()) continue; //check for and remove double quotes if(file.find('"') == 0 && file.rfind('"') == file.size()-1) { if(file.size()<=2) continue; file = file.substr(1,file.size()-2); } commit.addFile(file, status); } //check we at least got a username if(commit.username.empty()) return false; return true; } gource-0.54/src/formats/svn.cpp0000644002342600234260000001631614362112040016342 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "svn.h" #include "../gource_settings.h" #include #ifdef HAVE_LIBTINYXML #include #else #include "../tinyxml/tinyxml.h" #endif Regex svn_xml_tag("^<\\??xml"); Regex svn_logentry_start("^"); Regex svn_logentry_timestamp("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})"); std::string SVNCommitLog::logCommand() { std::string start = (!gGourceSettings.start_date.empty()) ? str(boost::format("{%s}") % gGourceSettings.start_date) : "1"; std::string stop = (!gGourceSettings.stop_date.empty()) ? str(boost::format("{%s}") % gGourceSettings.stop_date) : "HEAD"; std::string range = str(boost::format("%s:%s") % start % stop); std::string log_command = str(boost::format("svn log -r %s --xml --verbose --quiet") % range); return log_command; } SVNCommitLog::SVNCommitLog(const std::string& logfile) : RCommitLog(logfile, '<') { log_command = logCommand(); //can generate log from directory if(!logf && is_dir) { logf = generateLog(logfile); if(logf) { success = true; seekable = true; } } logentry.reserve(1024); } BaseLog* SVNCommitLog::generateLog(const std::string& dir) { //get working directory char cwd_buff[1024]; if(getcwd(cwd_buff, 1024) != cwd_buff) { return 0; } //does directory have a .svn ? std::string gitdir = dir + std::string("/.svn"); struct stat dirinfo; int stat_rc = stat(gitdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR)) { return 0; } // do we have this client installed requireExecutable("svn"); std::string command = getLogCommand(); //create temp file createTempLog(); if(temp_file.size()==0) return 0; if(chdir(dir.c_str()) != 0) { return 0; } char cmd_buff[2048]; snprintf(cmd_buff, 2048, "%s > %s", command.c_str(), temp_file.c_str()); int command_rc = systemCommand(cmd_buff); chdir(cwd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; } #ifndef HAVE_TIMEGM std::string system_tz; bool system_tz_init = false; time_t __timegm_hack(struct tm* tm) { if(!system_tz_init) { char* current_tz_env = getenv("TZ"); if(current_tz_env != 0) { system_tz = std::string("TZ=") + current_tz_env; } system_tz_init = true; } putenv((char*)"TZ=UTC"); tzset(); time_t timestamp = mktime(tm); if(!system_tz.empty()) { putenv((char*)system_tz.c_str()); } else { #ifdef HAVE_UNSETENV unsetenv("TZ"); #else putenv((char*)"TZ="); #endif } tzset(); return timestamp; } #endif bool SVNCommitLog::parseCommit(RCommit& commit) { //fprintf(stderr,"parsing svn log\n"); std::string line; if(!getNextLine(line)) return false; //start of log entry if(!svn_logentry_start.match(line)) { //is this the start of the document if(!svn_xml_tag.match(line)) return false; //fprintf(stderr,"found xml tag\n"); //if so find the first logentry tag bool found_logentry = false; while(getNextLine(line)) { if(svn_logentry_start.match(line)) { found_logentry = true; break; } } if(!found_logentry) return false; } //fprintf(stderr,"found logentry\n"); logentry.clear(); logentry.append(line); logentry.append("\n"); //fprintf(stderr,"found opening tag\n"); bool endfound = false; while(getNextLine(line)) { logentry.append(line); logentry.append("\n"); if(svn_logentry_end.match(line)) { //fprintf(stderr,"found closing tag\n"); endfound=true; break; } } //incomplete commit if(!endfound) return false; //fprintf(stderr,"read logentry\n"); TiXmlDocument doc; if(!doc.Parse(logentry.c_str())) return false; //fprintf(stderr,"try to parse logentry: %s\n", logentry.c_str()); TiXmlElement* leE = doc.FirstChildElement( "logentry" ); std::vector entries; if(!leE) return false; //parse date TiXmlElement* dateE = leE->FirstChildElement( "date" ); if(!dateE) return false; std::string timestamp_str(dateE->GetText()); if(!svn_logentry_timestamp.match(timestamp_str, &entries)) return false; struct tm time_str; time_str.tm_year = atoi(entries[0].c_str()) - 1900; time_str.tm_mon = atoi(entries[1].c_str()) - 1; time_str.tm_mday = atoi(entries[2].c_str()); time_str.tm_hour = atoi(entries[3].c_str()); time_str.tm_min = atoi(entries[4].c_str()); time_str.tm_sec = atoi(entries[5].c_str()); time_str.tm_isdst = -1; #ifdef HAVE_TIMEGM commit.timestamp = timegm(&time_str); #else commit.timestamp = __timegm_hack(&time_str); #endif //parse author TiXmlElement* authorE = leE->FirstChildElement("author"); if(authorE != 0) { // GetText() may return NULL, causing author instantiation to crash. std::string author; if(authorE->GetText()) author = authorE->GetText(); if(author.empty()) author = "Unknown"; commit.username = author; } TiXmlElement* pathsE = leE->FirstChildElement( "paths" ); //log entries sometimes dont have any paths if(!pathsE) return true; //parse changes for(TiXmlElement* pathE = pathsE->FirstChildElement("path"); pathE != 0; pathE = pathE->NextSiblingElement()) { //parse path const char* kind = pathE->Attribute("kind"); const char* action = pathE->Attribute("action"); //check for action if(action == 0) continue; bool is_dir = false; //if has the 'kind' attribute (old versions of svn dont have this), check if it is a dir if(kind != 0 && strcmp(kind,"dir") == 0) { //accept only deletes for directories if(strcmp(action, "D") != 0) continue; is_dir = true; } std::string file(pathE->GetText()); std::string status(action); if(file.empty()) continue; if(status.empty()) continue; //append trailing slash if is directory if(is_dir && file[file.size()-1] != '/') { file = file + std::string("/"); } commit.addFile(file, status); } //fprintf(stderr,"parsed logentry\n"); //read files return true; } gource-0.54/src/formats/cvs-exp.h0000644002342600234260000000174014362112040016561 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef CVSLOG_EXP_H #define CVSLOG_EXP_H #include "commitlog.h" class CVSEXPCommitLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); public: CVSEXPCommitLog(const std::string& logfile); static std::string logCommand(); }; #endif gource-0.54/src/formats/hg.cpp0000644002342600234260000000765414362112041016140 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "hg.h" #include "../core/sdlapp.h" #include "../gource_settings.h" #include Regex hg_regex("^([0-9]+) -?[0-9]+\\|([^|]+)\\|([ADM]?)\\|(.+)$"); std::string MercurialLog::logCommand() { // parse Mercurial log entries (using the gource.style template) std::string gource_style_path = gSDLAppResourceDir + std::string("gource.style"); std::string range = // date range (!gGourceSettings.start_date.empty() && !gGourceSettings.stop_date.empty()) ? str(boost::format("--date '%s to %s'") % gGourceSettings.start_date % gGourceSettings.stop_date) // start date only : (!gGourceSettings.start_date.empty()) ? str(boost::format("--date '>%s'") % gGourceSettings.start_date) // stop date only : (!gGourceSettings.stop_date.empty()) ? str(boost::format("--date '<%s'") % gGourceSettings.stop_date) // default : ""; std::string log_command = str(boost::format("hg log %s -r 0:tip --style '%s'") % range % gource_style_path); #ifdef _WIN32 std::replace(log_command.begin(), log_command.end(), '\'', '"'); #endif return log_command; } MercurialLog::MercurialLog(const std::string& logfile) : RCommitLog(logfile) { log_command = logCommand(); //can generate log from directory if(!logf && is_dir) { logf = generateLog(logfile); if(logf) { success = true; seekable = true; } } } BaseLog* MercurialLog::generateLog(const std::string& dir) { //does directory have a .hg ? std::string hgdir = dir + std::string("/.hg"); struct stat dirinfo; int stat_rc = stat(hgdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR)) { return 0; } // do we have this client installed requireExecutable("hg"); std::string command = getLogCommand(); createTempLog(); if(temp_file.size()==0) return 0; char cmd_buff[2048]; snprintf(cmd_buff, 2048, "%s -R \"%s\" > %s", command.c_str(), dir.c_str(), temp_file.c_str()); int command_rc = systemCommand(cmd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; } bool MercurialLog::parseCommit(RCommit& commit) { while(parseCommitEntry(commit)); return !commit.files.empty(); } bool MercurialLog::parseCommitEntry(RCommit& commit) { std::string line; std::vector entries; if(!getNextLine(line)) return false; //custom line if(!hg_regex.match(line, &entries)) return false; time_t timestamp = atol(entries[0].c_str()); std::string username = entries[1]; //if this file is for the same person and timestamp //we add to the commit, else we save the lastline //and return false if(commit.files.empty()) { commit.timestamp = timestamp; commit.username = username; } else { if(commit.timestamp != timestamp || commit.username != username) { lastline = line; return false; } } std::string action = "A"; if(!entries[2].empty()) { action = entries[2]; } commit.addFile(entries[3], action); //commit.debug(); return true; } gource-0.54/src/formats/cvs2cl.cpp0000644002342600234260000001053614362112041016727 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "cvs2cl.h" #include "../gource_settings.h" #ifdef HAVE_LIBTINYXML #include #else #include "../tinyxml/tinyxml.h" #endif Regex cvs2cl_xml_tag("^<\\??xml"); Regex cvs2cl_logentry_start("^"); Regex cvs2cl_logentry_timestamp("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})Z"); std::string CVS2CLCommitLog::logCommand() { std::string log_command = "cvs2cl --chrono --stdout --xml -g-q"; return log_command; } CVS2CLCommitLog::CVS2CLCommitLog(const std::string& logfile) : RCommitLog(logfile, '<') { } bool CVS2CLCommitLog::parseCommit(RCommit& commit) { //fprintf(stderr,"parsing cvs2cl log\n"); std::string line; if(!getNextLine(line)) return false; //start of log entry if(!cvs2cl_logentry_start.match(line)) { //is this the start of the document if(!cvs2cl_xml_tag.match(line)) return false; //fprintf(stderr,"found xml tag\n"); //if so find the first logentry tag bool found_logentry = false; while(getNextLine(line)) { if(cvs2cl_logentry_start.match(line)) { found_logentry = true; break; } } if(!found_logentry) return false; } //fprintf(stderr,"found logentry\n"); logentry.clear(); logentry.append(line); logentry.append("\n"); //fprintf(stderr,"found opening tag\n"); bool endfound = false; while(getNextLine(line)) { logentry.append(line); logentry.append("\n"); if(cvs2cl_logentry_end.match(line)) { //fprintf(stderr,"found closing tag\n"); endfound=true; break; } } //incomplete commit if(!endfound) return false; //fprintf(stderr,"read logentry\n"); TiXmlDocument doc; if(!doc.Parse(logentry.c_str())) return false; //fprintf(stderr,"try to parse logentry: %s\n", logentry.c_str()); TiXmlElement* leE = doc.FirstChildElement( "entry" ); std::vector entries; if(!leE) return false; //parse date TiXmlElement* dateE = leE->FirstChildElement( "isoDate" ); if(!dateE) return false; std::string timestamp_str(dateE->GetText()); if(!cvs2cl_logentry_timestamp.match(timestamp_str, &entries)) return false; struct tm time_str; time_str.tm_year = atoi(entries[0].c_str()) - 1900; time_str.tm_mon = atoi(entries[1].c_str()) - 1; time_str.tm_mday = atoi(entries[2].c_str()); time_str.tm_hour = atoi(entries[3].c_str()); time_str.tm_min = atoi(entries[4].c_str()); time_str.tm_sec = atoi(entries[5].c_str()); time_str.tm_isdst = -1; commit.timestamp = mktime(&time_str); //parse author TiXmlElement* authorE = leE->FirstChildElement("author"); if(authorE != 0) { std::string author(authorE->GetText()); if(author.empty()) author = "Unknown"; commit.username = author; } //parse changes for(TiXmlElement* fileE = leE->FirstChildElement("file"); fileE != 0; fileE = fileE->NextSiblingElement()) { TiXmlElement* state = fileE->FirstChildElement("cvsstate"); TiXmlElement* name = fileE->FirstChildElement("name"); //check for state if(name == 0 || state == 0) continue; std::string status = strcmp(state->GetText(), "dead") == 0 ? "D" : "M"; std::string file(name->GetText()); if(file.empty()) continue; commit.addFile(file, status); } //fprintf(stderr,"parsed logentry\n"); //read files return true; } gource-0.54/src/formats/git.h0000644002342600234260000000204614362112041015760 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef GITLOG_H #define GITLOG_H #include "commitlog.h" class GitCommitLog : public RCommitLog { protected: bool parseCommit(RCommit& commit); BaseLog* generateLog(const std::string& dir); static void readGitVersion(); public: GitCommitLog(const std::string& logfile); static std::string logCommand(); }; #endif gource-0.54/src/slider.h0000644002342600234260000000300414362112041014777 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef POS_SLIDER_H #define POS_SLIDER_H #include "core/logger.h" #include "core/bounds.h" #include "core/fxfont.h" class PositionSlider { FXFont font; Bounds2D bounds; float percent; float mouseover; float mouseover_elapsed; float fade_time; float alpha; vec3 slidercol; float capwidth; std::string caption; void drawSlider(float position) const; public: PositionSlider(float percent = 0.0f); void init(); void setColour(vec3 col); void setCaption(const std::string& cap); void setPercent(float percent); void resize(); void show(); const Bounds2D& getBounds() const; bool mouseOver(vec2 pos, float* percent_ptr); bool click(vec2 pos, float* percent_ptr); void logic(float dt); void draw(float dt); }; #endif gource-0.54/src/gource.h0000644002342600234260000001417714362112041015016 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef GOURCE_H #define GOURCE_H #include #include #include #include "core/display.h" #include "core/shader.h" #include "core/sdlapp.h" #include "core/fxfont.h" #include "core/bounds.h" #include "core/seeklog.h" #include "core/frustum.h" #include "core/regex.h" #include "core/ppm.h" #include "core/mousecursor.h" #include "gource_settings.h" #include "logmill.h" #include "core/vbo.h" #include "bloom.h" #include "slider.h" #include "textbox.h" #include "action.h" #include "caption.h" #include "file.h" #include "user.h" #include "dirnode.h" #include "zoomcamera.h" #include "key.h" class Gource : public SDLApp { std::string logfile; FrameExporter* frameExporter; RLogMill* logmill; RCommitLog* commitlog; PositionSlider slider; ZoomCamera camera; FileKey file_key; bool debug, trace_debug; bool manual_zoom; bool manual_rotate; bool manual_camera; float rotation_remaining_angle; MouseCursor cursor; bool grab_mouse; bool mousemoved; bool mouseclicked; bool mousedragged; vec2 cursor_move; bool recolour; bool use_selection_bounds; Bounds2D selection_bounds; float rotate_angle; vec2 mousepos; float last_percent; bool stop_position_reached; int tag_seq, commit_seq; GLint mouse_hits; RFile* hoverFile; RFile* selectedFile; RUser* hoverUser; RUser* selectedUser; quadbuf file_vbo; quadbuf user_vbo; quadbuf edge_vbo; quadbuf action_vbo; bloombuf bloom_vbo; GLuint selectionDepth; RDirNode* root; std::string displaydate; int date_x_offset; TextureResource* bloomtex; TextureResource* beamtex; TextureResource* logotex; TextureResource* backgroundtex; TextureResource* usertex; Shader* shadow_shader; Shader* text_shader; Shader* bloom_shader; float font_texel_size; TextBox textbox; FXFont font, fontlarge, fontmedium, fontcaption, fontdirname; bool first_read; bool paused; bool reloaded; bool take_screenshot; float max_tick_rate; int frameskip; int framecount; time_t currtime; time_t lasttime; float runtime; float subseconds; float splash; float idle_time; Uint32 screen_project_time; Uint32 draw_edges_time; Uint32 draw_shadows_time; Uint32 draw_actions_time; Uint32 draw_files_time; Uint32 draw_users_time; Uint32 draw_bloom_time; Uint32 update_vbos_time; Uint32 update_dir_tree_time; Uint32 update_user_tree_time; Uint32 draw_scene_time; Uint32 logic_time; Uint32 trace_time; Uint32 text_time; Uint32 text_update_time; Uint32 text_vbo_commit_time; Uint32 text_vbo_draw_time; bool track_users; Bounds2D dir_bounds; Bounds2D user_bounds; Bounds2D active_user_bounds; int commitqueue_max_size; float starting_z; std::deque commitqueue; std::map users; std::map files; std::map tagusermap; std::list captions; std::list active_captions; QuadTree* dirNodeTree; QuadTree* userTree; std::string message; float message_timer; void setMessage(const char* str, ...); void reset(); RUser* addUser(const std::string& username); RFile* addFile(const RCommitFile& cf); void deleteUser(RUser* user); void deleteFile(RFile* file); void selectBackground(); void selectUser(RUser* user); void selectFile(RFile* file); void selectNextUser(); void loadCaptions(); void readLog(); void logReadingError(const std::string& error); void processCommit(const RCommit& commit, float t); void addFileAction(const RCommit& commit, const RCommitFile& cf, RFile* file, float t); std::string dateAtPosition(float percent); void toggleCameraMode(); void updateCamera(float dt); void updateUsers(float t, float dt); void updateDirs(float dt); void interactUsers(); void interactDirs(); void updateBounds(); void updateTime(time_t display_time); void mousetrace(float dt); bool canSeek(); void seekTo(float percent); void zoom(bool zoomin); void loadingScreen(); void drawBackground(float dt); void drawScene(float dt); void updateVBOs(float dt); void updateAndDrawEdges(); void drawFileShadows(float dt); void drawUserShadows(float dt); void drawActions(float dt); void drawFiles(float dt); void drawUsers(float dt); void drawBloom(float dt); void screenshot(); void changeColours(); void grabMouse(bool grab_mouse); public: Gource(FrameExporter* frameExporter = 0); ~Gource(); static void writeCustomLog(const std::string& logfile, const std::string& output_file); void setCameraMode(const std::string& mode); void setCameraMode(bool track_users); void setFrameExporter(FrameExporter* exporter, int video_framerate); void showSplash(); bool isBusy(); void logic(float t, float dt); void draw(float t, float dt); void init(); void unload(); void reload(); void quit(); void update(float t, float dt); void keyPress(SDL_KeyboardEvent *e); void mouseMove(SDL_MouseMotionEvent *e); void mouseClick(SDL_MouseButtonEvent *e); #if SDL_VERSION_ATLEAST(2,0,0) void mouseWheel(SDL_MouseWheelEvent *e); #endif }; #endif gource-0.54/src/key.cpp0000644002342600234260000001745314362112041014655 0ustar andrewcandrewc#include "key.h" // File Key Entry // a string for the file ext and a colour FileKeyEntry::FileKeyEntry(const FXFont& font, const std::string& ext, const vec3& colour) { this->ext = ext; this->colour = colour; this->pos_y = -1.0f; this->font = font; this->font.dropShadow(false); shadow = vec2(3.0, 3.0); width = 90.0f * gGourceSettings.font_scale; height = gGourceSettings.scaled_font_size + 4.0f; left_margin = gGourceSettings.scaled_font_size + 4.0f; count = 0; brightness = 1.0f; alpha = 0.0f; move_elapsed = 1.0f; src_y = -1.0f; dest_y = -1.0f; show = true; display_ext = ext; bool truncated = false; while(font.getWidth(display_ext) > width - 15.0f * gGourceSettings.font_scale) { display_ext.resize(display_ext.size()-1); truncated = true; } if(truncated) { display_ext += std::string("..."); } } const vec3& FileKeyEntry::getColour() const { return colour; } const std::string& FileKeyEntry::getExt() const { return ext; } void FileKeyEntry::setShow(bool show) { this->show = show; } bool FileKeyEntry::isFinished() const { return (count<=0 && alpha <= 0.0f); } void FileKeyEntry::colourize() { colour = ext.empty() ? vec3(1.0f, 1.0f, 1.0f) : colourHash(ext); } void FileKeyEntry::inc() { count++; } void FileKeyEntry::dec() { count--; } int FileKeyEntry::getCount() const { return count; } void FileKeyEntry::setCount(int count) { this->count = count; } void FileKeyEntry::setDestY(float dest_y) { if(dest_y == this->dest_y) return; this->dest_y = dest_y; src_y = pos_y; move_elapsed = 0.0f; } void FileKeyEntry::logic(float dt) { if(count<=0 || !show) { alpha = std::max(0.0f, alpha - dt); } else if(alpha < 1.0f) { alpha = std::min(1.0f, alpha + dt); } //move towards dest if(pos_y != dest_y) { //initialize pos from dest if new if(pos_y < 0.0f) pos_y = dest_y; else { move_elapsed += dt; if(move_elapsed >= 1.0f) pos_y = dest_y; else pos_y = src_y + (dest_y - src_y) * move_elapsed; } } pos = vec2(alpha * left_margin, pos_y); } void FileKeyEntry::draw() { if(isFinished()) return; //label.draw(); glDisable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.0f, 0.0f, 0.0f, alpha * 0.333f); glPushMatrix(); glTranslatef(shadow.x, shadow.y, 0.0f); glBegin(GL_QUADS); glVertex2f(pos.x, pos.y); glVertex2f(pos.x, pos.y + height); glVertex2f(pos.x+width, pos.y + height); glVertex2f(pos.x+width, pos.y); glEnd(); glPopMatrix(); glBegin(GL_QUADS); glColor4f(colour.x * 0.5f, colour.y * 0.5f, colour.z * 0.5f, alpha); glVertex2f(pos.x, pos.y); glVertex2f(pos.x, pos.y + height); glColor4f(colour.x, colour.y, colour.z, alpha); glVertex2f(pos.x + width, pos.y + height); glVertex2f(pos.x + width, pos.y); glEnd(); glEnable(GL_TEXTURE_2D); font.setColour(vec4(1.0f, 1.0f, 1.0f, alpha)); font.dropShadow(false); font.draw((int)pos.x+2, (int)pos.y+3, display_ext.c_str()); font.dropShadow(true); font.print((int)pos.x+width+4, (int)pos.y+3, "%d", count); } // Key //maintain a key of all the current file types, updated periodically. //new entries slide in and out / fade in fade out FileKey::FileKey() { } FileKey::FileKey(float update_interval) { this->update_interval = update_interval; interval_remaining = 1.0f; font = fontmanager.grab(gGourceSettings.font_file, gGourceSettings.scaled_font_size); font.dropShadow(false); font.roundCoordinates(false); show = true; } FileKey::~FileKey() { active_keys.clear(); for(std::map::iterator it = keymap.begin(); it != keymap.end(); it++) { FileKeyEntry* entry = it->second; delete entry; } keymap.clear(); } void FileKey::setShow(bool show) { this->show = show; for(std::vector::iterator it = active_keys.begin(); it != active_keys.end(); it++) { FileKeyEntry* entry = *it; entry->setShow(show); } interval_remaining = 0.0f; } void FileKey::colourize() { for(std::vector::iterator it = active_keys.begin(); it != active_keys.end(); it++) { FileKeyEntry* entry = *it; entry->colourize(); } } void FileKey::clear() { for(std::vector::iterator it = active_keys.begin(); it != active_keys.end(); it++) { FileKeyEntry* entry = *it; entry->setCount(0); } interval_remaining = 0.0f; } void FileKey::inc(RFile* file) { FileKeyEntry* entry = 0; std::map::iterator result = keymap.find(file->ext); if(result != keymap.end()) { entry = result->second; } else { entry = new FileKeyEntry(font, file->ext, file->getFileColour()); keymap[file->ext] = entry; } entry->inc(); } //decrement count of extension. if drops to zero, mark it for removal void FileKey::dec(RFile* file) { std::map::iterator result = keymap.find(file->ext); if(result == keymap.end()) return; FileKeyEntry* entry = result->second; entry->dec(); } bool file_key_entry_sort (const FileKeyEntry* a, const FileKeyEntry* b) { //sort by count if(a->getCount() != b->getCount()) return (a->getCount() > b->getCount()); //then by name (tie breaker) return a->getExt().compare(b->getExt()) < 0; } void FileKey::logic(float dt) { interval_remaining -= dt; //recalculate active_keys if(interval_remaining <= 0.0f) { if(show) { active_keys.clear(); std::vector finished_keys; for(std::map::iterator it = keymap.begin(); it != keymap.end(); it++) { FileKeyEntry* entry = it->second; if(!entry->isFinished()) { active_keys.push_back(entry); } else { finished_keys.push_back(entry); } } //sort std::sort(active_keys.begin(), active_keys.end(), file_key_entry_sort); //limit to entries we can put onto the screen int max_visible_entries = std::max(0, (int)((display.height - 150.0f) / 20.0f)); if (active_keys.size() > max_visible_entries) { active_keys.resize(max_visible_entries); } //set position float offset_y = gGourceSettings.scaled_font_size + 6.0f; float key_y = offset_y; for(std::vector::iterator it = active_keys.begin(); it != active_keys.end(); it++) { FileKeyEntry* entry = *it; if(entry->getCount()>0) { entry->setDestY(key_y); } key_y += offset_y; } //remove and delete finished entries for(std::vector::iterator it = finished_keys.begin(); it != finished_keys.end(); it++) { FileKeyEntry* entry = *it; keymap.erase(entry->getExt()); delete entry; } } interval_remaining = update_interval; } for(std::vector::iterator it = active_keys.begin(); it != active_keys.end(); it++) { FileKeyEntry* entry = *it; entry->logic(dt); } } void FileKey::draw() { for(std::vector::iterator it = active_keys.begin(); it != active_keys.end(); it++) { FileKeyEntry* entry = *it; entry->draw(); } } gource-0.54/src/action.h0000644002342600234260000000341014362112041014773 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef RACTION_H #define RACTION_H #include "user.h" #include "file.h" class RUser; class RFile; class RAction { protected: vec3 colour; virtual void apply(); public: RUser* source; RFile* target; time_t timestamp; float t; float progress; float rate; RAction(RUser* source, RFile* target, time_t timestamp, float t, const vec3& colour); virtual ~RAction() {}; inline bool isFinished() const { return (progress >= 1.0); }; virtual void logic(float dt); void drawToVBO(quadbuf& buffer) const ; void draw(float dt); }; class CreateAction : public RAction { public: CreateAction(RUser* source, RFile* target, time_t timestamp, float t); }; class RemoveAction : public RAction { public: RemoveAction(RUser* source, RFile* target, time_t timestamp, float t); void logic(float dt); }; class ModifyAction : public RAction { protected: vec3 modify_colour; public: ModifyAction(RUser* source, RFile* target, time_t timestamp, float t, const vec3& modify_colour); void apply(); }; #endif gource-0.54/src/core/0000755002342600234260000000000014362112041014277 5ustar andrewcandrewcgource-0.54/src/core/png_writer.cpp0000644002342600234260000001432114362112041017164 0ustar andrewcandrewc/* Copyright (c) 2013 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "png_writer.h" #include "display.h" #include #define PNG_SKIP_SETJMP_CHECK #include PNGWriter::PNGWriter(int components) : components(components) { out = 0; } bool PNGWriter::open(const std::string& filename) { out = new std::ofstream(filename.c_str(), std::ios::out | std::ios::binary); if(out->fail()) { delete out; out = 0; return false; } return true; } void PNGWriter::close() { ((std::fstream*)out)->close(); } void PNGWriter::setOutputStream(std::ostream* out) { this->out = out; } void PNGWriter::screenshot(const std::string& filename) { if(!open(filename)) return; std::vector buffer; buffer.resize(display.width * display.height * components); capture(buffer); writePNG(buffer); close(); } void PNGWriter::capture(std::vector& buffer) { GLenum pixel_format = components == 4 ? GL_RGBA : GL_RGB; glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, display.width, display.height, pixel_format, GL_UNSIGNED_BYTE, &(buffer[0])); } void png_writer_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { std::ostream* out = (std::ostream*) png_get_io_ptr(png_ptr); if (!out->write((char*)data, length)) png_error(png_ptr, "png_writer_write_data error"); } void png_writer_flush_data(png_structp png_ptr) { std::ostream *out = (std::ostream*) png_get_io_ptr(png_ptr); if (!out->flush()) png_error(png_ptr, "png_writer_flush_data error"); } void PNGWriter::writePNG(std::vector& buffer) { png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); if(!png_ptr) throw PNGExporterException("png_create_write_struct failed"); png_set_write_fn(png_ptr, out, png_writer_write_data, png_writer_flush_data); png_infop info_ptr = png_create_info_struct(png_ptr); if(!info_ptr) throw PNGExporterException("png_create_info_struct failed"); if(setjmp(png_jmpbuf(png_ptr))) { throw PNGExporterException("setjmp failed"); } int colour_type = (components == 4) ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB; png_set_IHDR(png_ptr, info_ptr, display.width, display.height, 8, colour_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); std::vector rows(display.height); for (int i = 0; i < display.height; i++) { rows[i] = (png_bytep) &(buffer[(display.height-i-1) * components * display.width]); } png_write_info(png_ptr, info_ptr); png_write_image(png_ptr, &(rows[0])); png_write_end(png_ptr, 0); png_destroy_write_struct(&png_ptr, &info_ptr); } // PNGExporter PNGExporter::PNGExporter(const std::string& filename) { buffer1.resize(display.width * display.height * 3); buffer2.resize(display.width * display.height * 3); buffer_shared_ptr = 0; thread_state = PNG_EXPORTER_WAIT; cond = SDL_CreateCond(); mutex = SDL_CreateMutex(); if(filename == "-") { writer.setOutputStream(&std::cout); } else { this->filename = filename; if(!writer.open(filename)) { throw PNGExporterException(filename); } } #if SDL_VERSION_ATLEAST(2,0,0) thread = SDL_CreateThread( PNGExporter::startThread, "png_exporter", this ); #else thread = SDL_CreateThread( PNGExporter::startThread, this ); #endif } PNGExporter::~PNGExporter() { stop(); SDL_DestroyCond(cond); SDL_DestroyMutex(mutex); buffer_shared_ptr = 0; if(!filename.empty()) { writer.close(); } } int PNGExporter::startThread(void *exporter) { (static_cast(exporter))->run(); return 0; } void PNGExporter::run() { SDL_mutexP(mutex); while(thread_state != PNG_EXPORTER_EXIT) { thread_state = PNG_EXPORTER_WAIT; while (thread_state == PNG_EXPORTER_WAIT) { SDL_CondWait(cond, mutex); } if (thread_state != PNG_EXPORTER_WRITE) break; if (buffer_shared_ptr != 0) { writer.writePNG(*buffer_shared_ptr); } } thread_state = PNG_EXPORTER_STOPPED; SDL_mutexV(mutex); } void PNGExporter::stop() { if(!thread) return; if(thread_state == PNG_EXPORTER_STOPPED || thread_state == PNG_EXPORTER_EXIT) return; SDL_mutexP(mutex); thread_state = PNG_EXPORTER_EXIT; SDL_CondSignal(cond); SDL_mutexV(mutex); SDL_WaitThread(thread, 0); thread = 0; } void PNGExporter::capture() { std::vector* next_pixel_ptr = (buffer_shared_ptr == &buffer1) ? &buffer2 : &buffer1; writer.capture(*next_pixel_ptr); SDL_mutexP(mutex); buffer_shared_ptr = next_pixel_ptr; thread_state = PNG_EXPORTER_WRITE; SDL_CondSignal(cond); SDL_mutexV(mutex); } gource-0.54/src/core/display.cpp0000644002342600234260000005342714362112041016463 0ustar andrewcandrewc /* Copyright (c) 2008 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "display.h" #include "sdlapp.h" #include #if SDL_VERSION_ATLEAST(2,0,0) #include "SDL_syswm.h" #endif SDLAppDisplay display; SDLAppDisplay::SDLAppDisplay() { clear_colour = vec4(0.0f,0.0f,0.0f,1.0f); zbuffer_depth = 16; enable_alpha = false; vsync = false; resizable = false; frameless = false; experimental = false; high_dpi_aware = false; multi_sample = 0; width = 0; height = 0; desktop_width = 0; desktop_height = 0; windowed_width = 0; windowed_height = 0; viewport_dpi_ratio = vec2(1.0f, 1.0f); #if SDL_VERSION_ATLEAST(2,0,0) sdl_window = 0; gl_context = 0; framed_width = 0; framed_height = 0; framed_x = 0; framed_y = 0; #else surface = 0; #endif } SDLAppDisplay::~SDLAppDisplay() { } void SDLAppDisplay::setClearColour(vec3 colour) { setClearColour(vec4(colour, enable_alpha ? 0.0f : 1.0f)); } void SDLAppDisplay::setClearColour(vec4 colour) { clear_colour = colour; } Uint32 SDLAppDisplay::SDLWindowFlags(bool fullscreen) { #if SDL_VERSION_ATLEAST(2,0,0) Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN; if (frameless) flags |= SDL_WINDOW_BORDERLESS; if (resizable && !frameless) flags |= SDL_WINDOW_RESIZABLE; if (fullscreen) flags |= SDL_WINDOW_FULLSCREEN; #ifndef _WIN32 // see setWindowsHighDPIAwareness() work around for Windows if(high_dpi_aware) flags |= SDL_WINDOW_ALLOW_HIGHDPI; #endif #else Uint32 flags = SDL_OPENGL | SDL_HWSURFACE | SDL_ANYFORMAT | SDL_DOUBLEBUF; if (frameless) flags |= SDL_NOFRAME; if (resizable && !fullscreen) flags |= SDL_RESIZABLE; if (fullscreen) flags |= SDL_FULLSCREEN; #endif return flags; } void SDLAppDisplay::enableVsync(bool vsync) { this->vsync = vsync; } void SDLAppDisplay::setZBufferDepth(int zbuffer_depth) { this->zbuffer_depth = zbuffer_depth; } void SDLAppDisplay::enableResize(bool resizable) { this->resizable = resizable; } void SDLAppDisplay::enableFrameless(bool frameless) { this->frameless = frameless; } void SDLAppDisplay::enableHighDPIAwareness(bool enable) { high_dpi_aware = enable; } void SDLAppDisplay::enableAlpha(bool enable) { enable_alpha = enable; } void SDLAppDisplay::enableExperimental(bool enable) { experimental = enable; } void SDLAppDisplay::multiSample(int samples) { multi_sample = samples; } void SDLAppDisplay::setupExtensions() { if(experimental) glewExperimental = true; GLenum err = glewInit(); #ifdef GLEW_ERROR_NO_GLX_DISPLAY // Ignore GLEW_ERROR_NO_GLX_DISPLAY error as wont have GLX if using Wayland if (GLEW_OK != err && GLEW_ERROR_NO_GLX_DISPLAY != err) { #else if (GLEW_OK != err) { #endif /* Problem: glewInit failed, something is seriously wrong. */ char glewerr[1024]; snprintf(glewerr, 1024, "GLEW Error: %s", glewGetErrorString(err)); throw SDLInitException(std::string(glewerr)); } } bool SDLAppDisplay::multiSamplingEnabled() { int value; SDL_GL_GetAttribute( SDL_GL_MULTISAMPLEBUFFERS, &value ); return value==1; } #if SDL_VERSION_ATLEAST(2,0,0) && defined(_WIN32) WNDPROC window_proc = 0; LRESULT CALLBACK window_filter_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam) { if (msg == WM_SYSCOMMAND && (wparam & 0xfff0) == SC_KEYMENU) { return 0; } return CallWindowProc(window_proc, wnd, msg, wparam, lparam); } #endif void SDLAppDisplay::updateViewportDPIRatio() { int drawable_width, drawable_height; SDL_GL_GetDrawableSize(sdl_window, &drawable_width, &drawable_height); int sdl_window_width, sdl_window_height; SDL_GetWindowSize(sdl_window, &sdl_window_width, &sdl_window_height); viewport_dpi_ratio = vec2(drawable_width, drawable_height) / vec2(sdl_window_width, sdl_window_height); debugLog("viewport dpi ratio %.2f x %.2f", viewport_dpi_ratio.x, viewport_dpi_ratio.y); } void SDLAppDisplay::setVideoMode(int width, int height, bool fullscreen, int screen) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, zbuffer_depth); if(multi_sample > 0) { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, (GLuint) multi_sample); } if(enable_alpha) { SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); } Uint32 flags = SDLWindowFlags(fullscreen); if(gl_context != 0) SDL_GL_DeleteContext(gl_context); int position_x = -1; int position_y = -1; int display_index = -1; if(sdl_window != 0) { display_index = SDL_GetWindowDisplayIndex(sdl_window); SDL_GetWindowPosition(sdl_window, &position_x, &position_y); SDL_DestroyWindow(sdl_window); } else if(screen > 0 && screen <= SDL_GetNumVideoDisplays()) { display_index = screen-1; } if(display_index != -1) { sdl_window = SDL_CreateWindow(gSDLAppTitle.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(display_index), SDL_WINDOWPOS_UNDEFINED_DISPLAY(display_index), width, height, flags); if(sdl_window && position_x >= 0 && position_y >= 0) { SDL_SetWindowPosition(sdl_window, position_x, position_y); } } else { sdl_window = SDL_CreateWindow(gSDLAppTitle.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, flags); } if (!sdl_window) { // retry without multi-sampling enabled if(multi_sample > 0) { multi_sample = 0; SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); if(display_index != -1) { sdl_window = SDL_CreateWindow(gSDLAppTitle.c_str(), SDL_WINDOWPOS_UNDEFINED_DISPLAY(display_index), SDL_WINDOWPOS_UNDEFINED_DISPLAY(display_index), width, height, flags); if(sdl_window && position_x >= 0 && position_y >= 0) { SDL_SetWindowPosition(sdl_window, position_x, position_y); } } else { sdl_window = SDL_CreateWindow(gSDLAppTitle.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, flags); } } if(!sdl_window) { std::string sdlerr(SDL_GetError()); throw SDLInitException(sdlerr); } } gl_context = SDL_GL_CreateContext(sdl_window); if(!gl_context) { std::string sdlerr(SDL_GetError()); throw SDLInitException(sdlerr); } if(vsync) SDL_GL_SetSwapInterval(1); else SDL_GL_SetSwapInterval(0); #else int bpp = 32; int flags = SDLWindowFlags(fullscreen); if(vsync) SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); else SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); if(multi_sample > 0) { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, (GLuint) multi_sample); } if(enable_alpha) { SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); } SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, zbuffer_depth); surface = SDL_SetVideoMode(width, height, bpp, flags); if (!surface) { if (multi_sample > 0) { #ifndef _WIN32 // Retry without multi-sampling before failing std::cerr << "Failed to set video mode: " << SDL_GetError() << std::endl << "Trying again without multi-sampling" << std::endl; #endif multi_sample = 0; SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); surface = SDL_SetVideoMode(width, height, bpp, flags); } if (!surface) { std::string sdlerr(SDL_GetError()); throw SDLInitException(sdlerr); } } #endif setupExtensions(); #if SDL_VERSION_ATLEAST(2,0,0) && defined(_WIN32) // suppress 'ding' noise when doing alt+key combinations // solution from: http://forums.libsdl.org/viewtopic.php?t=6075 SDL_SysWMinfo sys_window_info; SDL_VERSION(&sys_window_info.version); if(SDL_GetWindowWMInfo(sdl_window, &sys_window_info)) { HWND wnd = sys_window_info.info.win.window; window_proc = (WNDPROC) GetWindowLongPtr(wnd, GWLP_WNDPROC); SetWindowLongPtr(wnd, GWLP_WNDPROC, (LONG_PTR) &window_filter_proc); } #endif } void SDLAppDisplay::getFullscreenResolution(int& width, int& height) { int fullscreen_width = desktop_width; int fullscreen_height = desktop_height; #if SDL_VERSION_ATLEAST(2,0,0) // TODO: SDL2 api will have a nice way to do this ... #else float aspect_ratio = fullscreen_width / (float) fullscreen_height; if(aspect_ratio > 2.5) { SDL_Rect** modes = SDL_ListModes(0, SDLWindowFlags(true)); if(modes != (SDL_Rect**)0 && modes != (SDL_Rect**)-1) { for (int i=0; modes[i]; i++) { if(modes[i]->h == fullscreen_height && (modes[i]->w/(float)modes[i]->h) < 2.5) { fullscreen_width = modes[i]->w; break; } } } } #endif width = fullscreen_width; height = fullscreen_height; } void SDLAppDisplay::toggleFullscreen() { int width = this->width; int height = this->height; if(!fullscreen) { //save windowed width and height windowed_width = width; windowed_height = height; getFullscreenResolution(width, height); } else { //switch back to window dimensions, if known if(windowed_width != 0) { width = windowed_width; height = windowed_height; } } fullscreen = !fullscreen; int resized_width, resized_height; #if SDL_VERSION_ATLEAST(2,0,0) SDL_SetWindowFullscreen(sdl_window, fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); SDL_GL_GetDrawableSize(sdl_window, &resized_width, &resized_height); updateViewportDPIRatio(); #else setVideoMode(width, height, fullscreen); const SDL_VideoInfo* display_info = SDL_GetVideoInfo(); resized_width = display_info->current_w; resized_height = display_info->current_h; #endif //set viewport to match what we ended up on glViewport(0, 0, resized_width, resized_height); this->width = resized_width; this->height = resized_height; } void SDLAppDisplay::toggleFrameless() { #ifdef __APPLE__ debugLog("Frameless toggle not supported"); return; #endif #if SDL_VERSION_ATLEAST(2,0,0) if(fullscreen) return; frameless = !frameless; if(frameless) { int position_x, position_y; SDL_GetWindowPosition(sdl_window, &position_x, &position_y); framed_width = width; framed_height = height; framed_x = position_x; framed_y = position_y; #ifdef _WIN32 SDL_SysWMinfo sys_window_info; SDL_VERSION(&sys_window_info.version); if(SDL_GetWindowWMInfo(sdl_window, &sys_window_info)) { //make the new window equal the size of the old window including frame HWND wnd = sys_window_info.info.win.window; RECT rect; GetWindowRect(wnd, &rect); position_x = rect.left; position_y = rect.top; width = rect.right - rect.left; height = rect.bottom - rect.top; } #endif //work around window position changing when when frame is toggled //related bug: https://bugzilla.libsdl.org/show_bug.cgi?id=2791 SDL_SetWindowBordered(sdl_window, SDL_FALSE); SDL_SetWindowSize(sdl_window, width, height); SDL_SetWindowPosition(sdl_window, position_x, position_y); //window needs to be recreated to remove SDL_WINDOW_RESIZABLE flag //otherwise there is still a weird border setVideoMode(width, height, fullscreen); } else { #ifdef _WIN32 // handle computing framed window position // if launched in frameless mode initially if(framed_width == 0) { SDL_SysWMinfo sys_window_info; SDL_VERSION(&sys_window_info.version); if(SDL_GetWindowWMInfo(sdl_window, &sys_window_info)) { HWND wnd = sys_window_info.info.win.window; RECT old_rect; GetWindowRect(wnd, &old_rect); SDL_SetWindowBordered(sdl_window, SDL_TRUE); RECT new_rect; GetWindowRect(wnd, &new_rect); SDL_GetWindowSize(sdl_window, &framed_width, &framed_height); SDL_GetWindowPosition(sdl_window, &framed_x, &framed_y); int width_delta = (new_rect.right - new_rect.left) - (old_rect.right - old_rect.left); int height_delta = (new_rect.bottom - new_rect.top) - (old_rect.bottom - old_rect.top); framed_width = width - width_delta; framed_height = height - height_delta; framed_x += width_delta; framed_y += height_delta; // HACK: account for the resizable windows border being 2 pixels wider if(resizable) { framed_x += 2; framed_y += 2; } } } #endif SDL_SetWindowBordered(sdl_window, SDL_TRUE); if(framed_width > 0) { width = framed_width; height = framed_height; } SDL_SetWindowSize(sdl_window, width, height); if(framed_width > 0) { SDL_SetWindowPosition(sdl_window, framed_x, framed_y); } setVideoMode(width, height, fullscreen); } #endif } bool SDLAppDisplay::isFullscreen() const { return fullscreen; } bool SDLAppDisplay::isFrameless() const { return frameless; } void SDLAppDisplay::resize(int width, int height) { debugLog("resize %d x %d", width, height); int resized_width, resized_height; #if SDL_VERSION_ATLEAST(2,0,0) SDL_GL_GetDrawableSize(sdl_window, &resized_width, &resized_height); updateViewportDPIRatio(); #else setVideoMode(width, height, fullscreen); const SDL_VideoInfo* display_info = SDL_GetVideoInfo(); resized_width = display_info->current_w; resized_height = display_info->current_h; #endif //set viewport to match what we ended up on glViewport(0, 0, resized_width, resized_height); this->width = resized_width; this->height = resized_height; } #ifdef _WIN32 void setWindowsHighDPIAwareness() { // Because SDL2 doesn't currently do anything if you set SDL_WINDOW_ALLOW_HIGHDPI // on Windows, it is necessary to manually tell Windows your application supports high DPI, // otherwise it will give you a 1920x1080 window when you request 3840x2160 on a 4K display // https://discourse.libsdl.org/t/sdl-getdesktopdisplaymode-resolution-reported-in-windows-10-when-using-app-scaling/22389/3 typedef enum PROCESS_DPI_AWARENESS { PROCESS_DPI_UNAWARE = 0, PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2 } ; BOOL(WINAPI *SetProcessDPIAware)(void) = NULL; HRESULT(WINAPI *SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS dpiAwareness) = NULL; if (void* userDLL = SDL_LoadObject("USER32.DLL")) { SetProcessDPIAware = (BOOL(WINAPI *)(void)) SDL_LoadFunction(userDLL, "SetProcessDPIAware"); } if (void* shcoreDLL = SDL_LoadObject("SHCORE.DLL")) { SetProcessDpiAwareness = (HRESULT(WINAPI *)(PROCESS_DPI_AWARENESS)) SDL_LoadFunction(shcoreDLL, "SetProcessDpiAwareness"); } if (SetProcessDpiAwareness) { // Windows 8.1 and later HRESULT result = SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE); debugLog("SetProcessDpiAwareness %d", (result == S_OK) ? 1 : 0); } else if (SetProcessDPIAware) { // Vista / Windows 8 BOOL success = SetProcessDPIAware(); debugLog("SetProcessDPIAware %d", (int)success); } } #endif void SDLAppDisplay::init(std::string window_title, int width, int height, bool fullscreen, int screen) { if(SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO) != 0) { throw SDLInitException(SDL_GetError()); } #ifdef _WIN32 if(high_dpi_aware) setWindowsHighDPIAwareness(); #endif #if SDL_VERSION_ATLEAST(2,0,0) // check screen is valid if(screen <= 0 || screen > SDL_GetNumVideoDisplays()) { screen = -1; } SDL_Rect display_rect; SDL_GetDisplayBounds(screen > 0 ? screen-1 : 0, &display_rect); desktop_width = display_rect.w; desktop_height = display_rect.h; #else const SDL_VideoInfo* display_info = SDL_GetVideoInfo(); //save the desktop resolution desktop_width = display_info->current_w; desktop_height = display_info->current_h; #endif //initialize width and height to desktop resolution if un-specified if(!width || !height) { if(fullscreen) { getFullscreenResolution(width, height); } else { if(!width) width = desktop_width; if(!height) height = desktop_height; } } atexit(SDL_Quit); #if SDL_VERSION_ATLEAST(2,0,0) #else SDL_EnableUNICODE(1); SDL_WM_SetCaption(window_title.c_str(),0); #endif debugLog("requesting video mode %d x %d", width, height); setVideoMode(width, height, fullscreen, screen); //get actual opengl viewport GLint viewport[4]; glGetIntegerv( GL_VIEWPORT, viewport ); this->width = viewport[2]; this->height = viewport[3]; this->fullscreen = fullscreen; debugLog("opengl viewport %d x %d", this->width, this->height); int drawable_width, drawable_height; SDL_GL_GetDrawableSize(this->sdl_window, &drawable_width, &drawable_height); debugLog("drawable size %d x %d", drawable_width, drawable_height); updateViewportDPIRatio(); glViewport(0, 0, this->width, this->height); } void SDLAppDisplay::quit() { #if SDL_VERSION_ATLEAST(2,0,0) if(gl_context != 0) SDL_GL_DeleteContext(gl_context); if(sdl_window != 0) SDL_DestroyWindow(sdl_window); #endif texturemanager.purge(); shadermanager.purge(); fontmanager.purge(); fontmanager.destroy(); } void SDLAppDisplay::update() { #if SDL_VERSION_ATLEAST(2,0,0) SDL_GL_SwapWindow(sdl_window); #else SDL_GL_SwapBuffers(); #endif } void SDLAppDisplay::clear() { glClearColor(clear_colour.x, clear_colour.y, clear_colour.z, clear_colour.w); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } void SDLAppDisplay::mode3D(float fov, float znear, float zfar) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(fov, (GLfloat)width/(GLfloat)height, znear, zfar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void SDLAppDisplay::mode2D() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, height, 0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void SDLAppDisplay::push2D() { glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, display.width, display.height, 0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); } void SDLAppDisplay::pop2D() { glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); } vec4 SDLAppDisplay::currentColour() { vec4 colour; glGetFloatv(GL_CURRENT_COLOR, glm::value_ptr(colour)); return colour; } vec3 SDLAppDisplay::project(vec3 pos) { GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLdouble winX, winY, winZ; glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); glGetIntegerv( GL_VIEWPORT, viewport ); gluProject( pos.x, pos.y, pos.z, modelview, projection, viewport, &winX, &winY, &winZ); winY = (float)viewport[3] - winY; return vec3((float) winX, (float) winY, (float) winZ); } vec3 SDLAppDisplay::unproject(vec2 pos) { GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); glGetIntegerv( GL_VIEWPORT, viewport ); winX = pos.x; winY = (float)viewport[3] - pos.y; glReadPixels( int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); return vec3((float) posX, (float) posY, (float) posZ); } gource-0.54/src/core/fxfont.cpp0000644002342600234260000004245014362112041016314 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Portions of this code are derivived from FTGL (FTTextureFont.cpp) FTGL - OpenGL font library Copyright (c) 2001-2004 Henry Maddocks Copyright (c) 2008 Sam Hocevar 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "fxfont.h" FXFontManager fontmanager; //FxGlyph FXGlyph::FXGlyph(FXGlyphSet* set, unsigned int chr) { this->set = set; this->chr = chr; this->ftglyph = 0; FT_Face ft_face = set->getFTFace(); FT_UInt index = FT_Get_Char_Index( ft_face, chr ); //debugLog("FXGlyph %x %d %d", chr, chr, index); if(FT_Load_Glyph( ft_face, index, set->getFlags())) throw FXFontException(ft_face->family_name); if(FT_Get_Glyph( ft_face->glyph, &ftglyph )) throw FXFontException(ft_face->family_name); FT_Glyph_Metrics *metrics = &ft_face->glyph->metrics; height = glm::ceil(metrics->height / 64.0); FT_Glyph_To_Bitmap( &ftglyph, FT_RENDER_MODE_NORMAL, 0, 1 ); glyph_bitmap = (FT_BitmapGlyph)ftglyph; dims = vec2( glyph_bitmap->bitmap.width, glyph_bitmap->bitmap.rows) + vec2(2.0f, 2.0f); corner = vec2( glyph_bitmap->left, -glyph_bitmap->top) + vec2(0.5, -0.5); advance = vec2( ft_face->glyph->advance.x >> 6, ft_face->glyph->advance.y >> 6); vertex_positions[0] = vec2(0.0f, 0.0f); vertex_positions[1] = vec2(dims.x, 0.0f); vertex_positions[2] = dims; vertex_positions[3] = vec2(0.0f, dims.y); //call_list = 0; page = 0; } FXGlyph::~FXGlyph() { if(ftglyph!=0) FT_Done_Glyph(ftglyph); } void FXGlyph::setPage(FXGlyphPage* page, const vec4& texcoords) { this->page = page; this->texcoords = texcoords; vertex_texcoords[0] = vec2(texcoords.x, texcoords.y); vertex_texcoords[1] = vec2(texcoords.z, texcoords.y); vertex_texcoords[2] = vec2(texcoords.z, texcoords.w); vertex_texcoords[3] = vec2(texcoords.x, texcoords.w); } void FXGlyph::drawToVBO(quadbuf& buffer, const vec2& pos, const vec4& colour) const { buffer.add(page->texture->textureid, pos + corner, dims, colour, texcoords); } void FXGlyph::draw(const vec2& pos) const { for(int i=0;i<4;i++) { vec2 pos_offset = vertex_positions[i] + pos + corner; glTexCoord2fv(glm::value_ptr(vertex_texcoords[i])); glVertex2fv(glm::value_ptr(pos_offset)); } } //FXGlyphPage FXGlyphPage::FXGlyphPage(int page_width, int page_height) { this->page_width = page_width; this->page_height = page_height; texture_data = new GLubyte[ page_width * page_height ]; memset(texture_data, 0, page_width * page_height); needs_update = false; texture = 0; max_glyph_height = cursor_x = cursor_y = 1; } FXGlyphPage::~FXGlyphPage() { delete[] texture_data; } bool FXGlyphPage::addGlyph(FXGlyph* glyph) { FT_BitmapGlyph bitmap = glyph->glyph_bitmap; int corner_x = cursor_x; int corner_y = cursor_y; int padding = 3; if(bitmap->bitmap.rows > max_glyph_height) max_glyph_height = bitmap->bitmap.rows; if(corner_x + bitmap->bitmap.width + padding > page_width) { corner_x = 1; corner_y += max_glyph_height + padding; //bitmap is bigger than the full dimension if(corner_x + bitmap->bitmap.width + padding > page_width) return false; } if(corner_y + bitmap->bitmap.rows + padding > page_height) return false; needs_update = true; for(int j=0; j < bitmap->bitmap.rows;j++) { for(int i=0; i < bitmap->bitmap.width; i++) { texture_data[(corner_x+i+(j+corner_y)*page_width)] = bitmap->bitmap.buffer[i + bitmap->bitmap.width*j]; } } //fprintf(stderr, "corner_x = %d, corner_y = %d\n", corner_x, corner_y); vec4 texcoords = vec4( (((float)corner_x)-0.5f) / (float) page_width, (((float)corner_y)-0.5f) / (float) page_height, (((float)corner_x+bitmap->bitmap.width)+1.5f) / (float) page_width, (((float)corner_y+bitmap->bitmap.rows)+1.5f) / (float) page_height ); glyph->setPage(this, texcoords); //glyph->compile(this, texcoords); // move cursor for next character cursor_x = corner_x + bitmap->bitmap.width + padding; cursor_y = corner_y; return true; } void FXGlyphPage::updateTexture() { if(!needs_update) return; if(!texture) { texture = texturemanager.create(page_width, page_height, false, GL_CLAMP_TO_EDGE, GL_ALPHA, texture_data); } else { texture->reload(); } needs_update = false; } //FXGlyphSet FXGlyphSet::FXGlyphSet(FT_Library freetype, const std::string& fontfile, int size, int dpi, FT_Int32 ft_flags) { this->freetype = freetype; this->fontfile = fontfile; this->size = size; this->dpi = dpi; this->ft_flags = ft_flags; this->ft_face = 0; this->tab_width = 4.0f; this->max_height = 0; init(); } FXGlyphSet::~FXGlyphSet() { if(ft_face!=0) FT_Done_Face(ft_face); for(std::vector::iterator it = pages.begin(); it != pages.end(); it++) { delete (*it); } pages.clear(); for(auto it: glyphs) { delete it.second; } glyphs.clear(); } void FXGlyphSet::init() { if(FT_New_Face(freetype, fontfile.c_str(), 0, &ft_face)) { throw FXFontException(fontfile); } int ft_font_size = 64 * size; FT_Set_Char_Size( ft_face, ft_font_size, ft_font_size, dpi, dpi ); double em_size = 1.0 * ft_face->units_per_EM; unit_scale = vec2( ft_face->size->metrics.x_ppem / em_size, ft_face->size->metrics.y_ppem / em_size); precache("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;:'\",<.>/?-_=+!@#$%^&*()\\ "); } void FXGlyphSet::precache(const std::string& chars) { FTUnicodeStringItr precache_glyphs((const unsigned char*)chars.c_str()); unsigned int chr; //add to bitmap without updating textures until the end pre_caching = true; while (*precache_glyphs) { chr = *precache_glyphs++; getGlyph(chr); } pre_caching = false; for(std::vector::iterator it = pages.begin(); it != pages.end(); it++) { (*it)->updateTexture(); } } FXGlyph* FXGlyphSet::getGlyph(unsigned int chr) { std::map::iterator it; if((it = glyphs.find(chr)) != glyphs.end()) return it->second; //if new FXGlyph* glyph = new FXGlyph(this, chr); // paint glyph to next page it will fit on FXGlyphPage* page = 0; if(!pages.empty()) page = pages.back(); //page is full, create new page if(page == 0 || !page->addGlyph(glyph)) { //allocate page using maximum allowed texture size GLint max_texture_size; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); max_texture_size = glm::min( 512, max_texture_size ); page = new FXGlyphPage(max_texture_size, max_texture_size); pages.push_back(page); if(!page->addGlyph(glyph)) { throw FXFontException(glyph->set->getFTFace()->family_name); } } max_height = glm::max( glyph->getHeight(), max_height ); //update the texture unless this is the precaching process if(!pre_caching) page->updateTexture(); glyphs[chr] = glyph; return glyph; } float FXGlyphSet::getMaxWidth() const { return ft_face->size->metrics.max_advance / 64.0f; } float FXGlyphSet::getMaxHeight() const { return max_height; } float FXGlyphSet::getAscender() const { return getFTFace()->ascender * unit_scale.y; } float FXGlyphSet::getDescender() const { return getFTFace()->descender * unit_scale.y; } float FXGlyphSet::getWidth(const std::string& text) { FTUnicodeStringItr unicode_text((const unsigned char*)text.c_str()); float width = 0.0; unsigned int chr; while (*unicode_text) { chr = *unicode_text++; FXGlyph* glyph = getGlyph(chr); width += glyph->getAdvance().x; } return width; } void FXGlyphSet::drawToVBO(vec2& cursor, const std::string& text, const vec4& colour) { FTUnicodeStringItr unicode_text((const unsigned char*)text.c_str()); unsigned int chr; while (*unicode_text) { chr = *unicode_text++; FXGlyph* glyph = getGlyph(chr); glyph->drawToVBO(fontmanager.font_vbo, cursor, colour); cursor += glyph->getAdvance(); } } void FXGlyphSet::draw(const std::string& text) { FTUnicodeStringItr unicode_text((const unsigned char*)text.c_str()); GLuint textureid = -1; unsigned int chr; vec2 pos; std::vector glyphs; glyphs.reserve(text.size()); // iterate over glyphs before drawing to avoid // encountering a new glyph while inside the GL draw call while (*unicode_text) { chr = *unicode_text++; if(chr == '\t') { FXGlyph* glyph = getGlyph('M'); pos += glyph->getAdvance() * tab_width; continue; } FXGlyph* glyph = getGlyph(chr); glyphs.push_back(glyph); } for(auto glyph : glyphs) { if(glyph->page->texture->textureid != textureid) { if(textureid != -1) glEnd(); textureid = glyph->page->texture->textureid; glBindTexture(GL_TEXTURE_2D, textureid); glBegin(GL_QUADS); } glyph->draw(pos); pos += glyph->getAdvance(); } if(textureid != -1) glEnd(); } void FXGlyphSet::drawPages() { glPushMatrix(); for(std::vector::iterator it = pages.begin(); it != pages.end(); it++) { FXGlyphPage* page = *it; page->texture->bind(); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex2f(page->texture->w, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex2f(page->texture->w, page->texture->h); glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, page->texture->h); glEnd(); glTranslatef(page->texture->w, 0.0f, 0.0f); } glPopMatrix(); } //FXFont FXFont::FXFont() { glyphset = 0; } FXFont::FXFont(FXGlyphSet* glyphset) { this->glyphset = glyphset; init(); } void FXFont::init() { shadow = false; shadow_strength = 0.7; shadow_offset = vec2(1.0, 1.0); round = false; align_right = false; align_top = true; colour = vec4(1.0f, 1.0f, 1.0f, 1.0f); shadow_colour = vec4(0.0f, 0.0f, 0.0f, shadow_strength); } void FXFont::roundCoordinates(bool round) { this->round = round; } void FXFont::alignRight(bool align_right) { this->align_right = align_right; } void FXFont::alignTop(bool align_top) { this->align_top = align_top; } void FXFont::shadowStrength(float s) { shadow_strength = s; shadow_colour.w = colour.w * shadow_strength; } void FXFont::setColour(const vec4& colour) { this->colour = colour; shadow_colour.w = colour.w * shadow_strength; } void FXFont::setAlpha(float alpha) { colour.w = alpha; shadow_colour.w = shadow_strength * alpha; } void FXFont::shadowOffset(float x, float y) { shadow_offset = vec2(x,y); } void FXFont::dropShadow(bool shadow) { this->shadow = shadow; } const std::string& FXFont::getFontFile() const { return glyphset->getFontFile(); } float FXFont::getMaxWidth() const { return glyphset->getMaxWidth(); } float FXFont::getMaxHeight() const { return glyphset->getMaxHeight(); } int FXFont::getFontSize() const { return glyphset->getSize(); } float FXFont::getWidth(const std::string& text) const { return glyphset->getWidth(text); } float FXFont::getHeight() const { return glm::ceil(getAscender() + getDescender()); } float FXFont::getAscender() const { return glyphset->getAscender(); } float FXFont::getDescender() const { return glyphset->getDescender(); } void FXFont::render(float x, float y, const std::string& text, const vec4& colour) const{ if(fontmanager.use_vbo) { vec2 cursor_start(x,y); glyphset->drawToVBO(cursor_start, text, colour); return; } glColor4fv(glm::value_ptr(colour)); glPushMatrix(); glTranslatef(x,y,0.0f); glyphset->draw(text); glPopMatrix(); } void FXFont::print(float x, float y, const char *str, ...) const{ char buf[4096]; va_list vl; va_start (vl, str); vsnprintf (buf, 4096, str, vl); va_end (vl); std::string text = std::string(buf); draw(x, y, text); } void FXFont::draw(float x, float y, const std::string& text) const { if(align_right) { x -= getWidth(text); } if(align_top) { y += getHeight(); } if(round) { x = roundf(x); y = roundf(y); } //buffered fonts need to do shadow in a shader pass if(shadow && !fontmanager.use_vbo) { render(x + shadow_offset.x, y + shadow_offset.y, text, shadow_colour); } render(x, y, text, colour); } void FXFont::drawGlyphes() { if(glyphset) glyphset->drawPages(); } // FXFontManager FXFontManager::FXFontManager() { library = 0; } void FXFontManager::init() { if(FT_Init_FreeType( &library )) throw FXFontException("Failed to init FreeType"); use_vbo = false; } void FXFontManager::unload() { font_vbo.unload(); } void FXFontManager::reload() { } void FXFontManager::startBuffer() { font_vbo.reset(); use_vbo = true; } void FXFontManager::commitBuffer() { font_vbo.update(); use_vbo = false; } void FXFontManager::drawBuffer() { font_vbo.draw(); } void FXFontManager::destroy() { if(library != 0) FT_Done_FreeType(library); } void FXFontManager::setDir(std::string font_dir) { this->font_dir = font_dir; } void FXFontManager::purge() { for(std::map::iterator it = fonts.begin(); it!=fonts.end();it++) { fontSizeMap* sizemap = it->second; for(fontSizeMap::iterator ft_it = sizemap->begin(); ft_it != sizemap->end(); ft_it++) { delete ft_it->second; } delete sizemap; } fonts.clear(); } FXFont FXFontManager::grab(std::string font_file, int size, int dpi, FT_Int32 ft_flags) { if(font_dir.size()>0 && !(font_file.size() > 2 && font_file[1] == ':') && !(font_file.size() > 1 && font_file[0] == '/')) { font_file = font_dir + font_file; } //sprintf(buf, "%s:%i", font_file.c_str(), size); //std::string font_key = std::string(buf); fontSizeMap* sizemap = fonts[font_file]; if(!sizemap) { sizemap = fonts[font_file] = new fontSizeMap; } fontSizeMap::iterator ft_it = sizemap->find(size); FXGlyphSet* glyphset; if(ft_it == sizemap->end()) { glyphset = new FXGlyphSet(library, font_file.c_str(), size, dpi, ft_flags); sizemap->insert(std::pair(size,glyphset)); } else { glyphset = ft_it->second; } return FXFont(glyphset); } gource-0.54/src/core/timer.h0000644002342600234260000000104714362112041015572 0ustar andrewcandrewc#ifndef CORE_TIMER_H #define CORE_TIMER_H #include #include "gl.h" class GLTimer { Uint32 query_start; Uint32 query_stop; Uint32 cpu_time; GLuint64 query_value; GLuint query_id; std::string name; public: GLTimer(); GLTimer(const std::string& name); ~GLTimer(); void start(); void stop(); bool check(); const std::string& getName() const; GLuint64 getValue() const; Uint32 getGLMillis() const; Uint32 getCPUMillis() const; void unload(); }; #endif gource-0.54/src/core/timer.cpp0000644002342600234260000000310314362112041016120 0ustar andrewcandrewc#include "timer.h" // GLTimer GLTimer::GLTimer() { query_id = 0; query_value = 0; query_start = 0; query_stop = 0; cpu_time = 0; } GLTimer::GLTimer(const std::string& name) : name(name) { query_id = 0; query_value = 0; query_start = 0; query_stop = 0; cpu_time = 0; } GLTimer::~GLTimer() { unload(); } void GLTimer::unload() { query_value = 0; if(query_id) { glDeleteQueries(1, &query_id); query_id = 0; } query_start = query_stop = 0; } void GLTimer::start() { if(query_start > 0) return; query_start = SDL_GetTicks(); if(!query_id) glGenQueries( 1, &query_id ); glBeginQuery(GL_TIME_ELAPSED, query_id); query_stop = 0; } void GLTimer::stop() { if(!query_start || query_stop > 0) return; glEndQuery(GL_TIME_ELAPSED); query_stop = SDL_GetTicks(); } const std::string& GLTimer::getName() const { return name; } GLuint64 GLTimer::getValue() const { return query_value; } Uint32 GLTimer::getGLMillis() const { return query_value / 1000000; } Uint32 GLTimer::getCPUMillis() const { return cpu_time; } bool GLTimer::check() { if(!query_start) return false; GLuint64 elapsed; GLint available = 0; glGetQueryObjectiv(query_id, GL_QUERY_RESULT_AVAILABLE, &available); if(!available) return false; glGetQueryObjectui64v(query_id, GL_QUERY_RESULT, &elapsed); query_value = elapsed; cpu_time = query_stop-query_start; query_start = query_stop = 0; return true; } gource-0.54/src/core/logger.h0000644002342600234260000000743614362112041015741 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef LOGGER_H #define LOGGER_H #include #include #include #include enum logger_level { LOG_LEVEL_OFF, LOG_LEVEL_ERROR, LOG_LEVEL_CONSOLE, LOG_LEVEL_INFO, LOG_LEVEL_SCRIPT, LOG_LEVEL_DEBUG, LOG_LEVEL_WARN, LOG_LEVEL_PEDANTIC }; class LoggerMessage { public: LoggerMessage(int level, const std::string& message); int level; std::string message; }; class Logger { protected: std::deque history; int hist_capacity; FILE* stream; int level; static Logger* default_logger; int message_count; bool auto_flush; public: static Logger* getDefault(); const std::deque& getHistory() const; void setLevel(int level) { this->level = level; }; int getLevel() const { return level; } int getMessageCount(); void setHistoryCapacity(int hist_capacity); void setAutoFlush(bool auto_flush); Logger(int level, FILE* stream, int history_capacity = 0); void init(int level, FILE* stream, int history_capacity); void message(int level, const std::string& message); }; void warnLog(const char *args, ...); void debugLog(const char *args, ...); void infoLog(const char *args, ...); void errorLog(const char *args, ...); void consoleLog(const char *args, ...); void scriptLog(const char *args, ...); void pedanticLog(const char *args, ...); class LoggerStringStream { protected: Logger* logger; std::ostringstream* ss; logger_level log_level; int count; public: LoggerStringStream(logger_level level) : ss(nullptr), log_level(level), count(0) { logger = Logger::getDefault(); } ~LoggerStringStream() { if(logger && ss != nullptr && count > 0) { logger->message(log_level, ss->str()); } delete ss; } template LoggerStringStream& operator<<(const T& value) { if(logger != nullptr && logger->getLevel() >= log_level) { if(!ss) ss = new std::ostringstream(); if(count > 0) { *ss << " "; } *ss << value; count++; } return *this; } }; LoggerStringStream WarnLog(); LoggerStringStream DebugLog(); LoggerStringStream InfoLog(); LoggerStringStream ErrorLog(); LoggerStringStream ConsoleLog(); LoggerStringStream ScriptLog(); #endif gource-0.54/src/core/plane.h0000644002342600234260000000334414362112041015553 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PLANE_H #define PLANE_H #include "vectors.h" class Plane { public: vec3 normal; vec3 point; float d; Plane(); Plane(const vec3 & v1, const vec3 & v2, const vec3 & v3); float distance(const vec3 & p) const; }; #endif gource-0.54/src/core/quadtree.cpp0000644002342600234260000002762414362112041016630 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "quadtree.h" // QUAD NODE // allow more items in node if // - has no children and one of any of: // * maximum depth reached // * item count is less than desired capacity bool QuadNode::allowMoreItems() { return (children.empty() && (depth >= tree->max_node_depth || items.size() < tree->max_node_items ) ); } void QuadNode::addItem(QuadItem* item) { if(allowMoreItems()) { tree->item_count++; item->node_count++; items.push_back(item); return; } if(!children.empty()) { addToChild(item); return; } vec2 average = bounds.centre(); vec2 middle = average - bounds.min; vec2 relmax = bounds.max-bounds.min; Bounds2D newbounds; children.reserve(4); //top left newbounds = Bounds2D( bounds.min + vec2(0.0, 0.0), bounds.min + middle ); children.push_back(new QuadNode(tree, this, newbounds, depth)); //top right newbounds = Bounds2D( bounds.min + vec2(middle.x, 0.0), bounds.min + vec2(relmax.x,middle.y) ); children.push_back(new QuadNode(tree, this, newbounds, depth)); //bottom left newbounds = Bounds2D( bounds.min + vec2(0.0, middle.y), bounds.min + vec2(middle.x,relmax.y) ); children.push_back(new QuadNode(tree, this, newbounds, depth)); //bottom right newbounds = Bounds2D( bounds.min + middle, bounds.max ); children.push_back(new QuadNode(tree, this, newbounds, depth)); for(std::list::iterator it = items.begin(); it != items.end(); it++) { QuadItem* oi = *it; tree->item_count--; oi->node_count--; addToChild(oi); } items.clear(); addToChild(item); } void QuadNode::addToChild(QuadItem* item) { if(children.empty()) return; for(int i=0;i<4;i++) { if(children[i]->bounds.overlaps(item->quadItemBounds)) { children[i]->addItem(item); } } } void QuadNode::getLeavesInFrustum(std::set& nodeset, Frustum& frustum) { if(!items.empty()) { nodeset.insert(this); return; } if(children.empty()) return; //for each 4 corners for(int i=0;i<4;i++) { if(!children[i]->empty() && frustum.intersects(children[i]->bounds)) { children[i]->getLeavesInFrustum(nodeset, frustum); } } return; } int QuadNode::getItemsInFrustum(std::set& itemset, Frustum& frustum) { if(!items.empty()) { int items_added = 0; for(std::list::iterator it = items.begin(); it != items.end(); it++) { QuadItem* oi = (*it); if(oi!=0) { itemset.insert(oi); items_added++; } } return items_added; } if(children.empty()) return 0; int count = 0; //for each 4 corners for(int i=0;i<4;i++) { if(!children[i]->empty() && frustum.intersects(children[i]->bounds)) { count += children[i]->getItemsInFrustum(itemset, frustum); } } return count; } int QuadNode::getItemsInBounds(std::set& itemset, Bounds2D& bounds) const{ if(!items.empty()) { int items_added = 0; for(std::list::const_iterator it = items.begin(); it != items.end(); it++) { QuadItem* oi = (*it); itemset.insert(oi); items_added++; } return items_added; } if(children.empty()) return 0; int count = 0; //for each 4 corners for(int i=0;i<4;i++) { if(!children[i]->empty() && bounds.overlaps(children[i]->bounds)) { count += children[i]->getItemsInBounds(itemset, bounds); } } return count; } int QuadNode::getItemsAt(std::set& itemset, vec2 pos) { if(!items.empty()) { int items_added = 0; for(std::list::iterator it = items.begin(); it != items.end(); it++) { QuadItem* oi = (*it); if(oi!=0) { itemset.insert(oi); items_added++; } } return items_added; } if(children.empty()) return 0; int index = getChildIndex(pos); if(index == -1) return 0; return children[index]->getItemsAt(itemset, pos); } void QuadNode::visitLeavesInFrustum(const Frustum& frustum, VisitFunctor & visit){ if(!items.empty()) { visit(this); }else if(!children.empty()){ //visit each corner for(int i=0;i<4;i++) if(!children[i]->empty() && frustum.intersects(children[i]->bounds)) children[i]->visitLeavesInFrustum(frustum, visit); } } void QuadNode::visitItemsInFrustum(const Frustum & frustum, VisitFunctor & visit){ if(!items.empty()) { for(std::list::const_iterator it = items.begin(); it != items.end(); it++) visit(*it); }else if(!children.empty()){ //visit each corner for(int i=0;i<4;i++) if(!children[i]->empty() && frustum.intersects(children[i]->bounds)) children[i]->visitItemsInFrustum(frustum, visit); } } void QuadNode::visitItemsInBounds(const Bounds2D & bounds, VisitFunctor & visit){ if(!items.empty()) { for(std::list::const_iterator it = items.begin(); it != items.end(); it++) visit(*it); }else if(!children.empty()){ //visit each corner for(int i=0;i<4;i++) if(!children[i]->empty() && bounds.overlaps(children[i]->bounds)) children[i]->visitItemsInBounds(bounds, visit); } } void QuadNode::visitItemsAt(const vec2 & pos, VisitFunctor & visit){ if(!items.empty()){ for(std::list::const_iterator it = items.begin(); it != items.end(); it++) if(*it) visit(*it); }else if(!children.empty()){ int index = getChildIndex(pos); if(index != -1) children[index]->visitItemsAt(pos, visit); } } bool QuadNode::empty() { return (items.empty() && children.empty()); } int QuadNode::getChildIndex(const vec2 & pos) const{ if(children.empty()) return -1; for(int i=0;i<4;i++) { if(children[i]->bounds.contains(pos)) { return i; } } return -1; } QuadNode::QuadNode(QuadTree* tree, QuadNode* parent, Bounds2D bounds, int parent_depth) { this->parent = parent; this->tree = tree; this->bounds = bounds; this->depth = parent_depth + 1; listid = 0; tree->node_count++; } QuadNode::~QuadNode() { if(listid) glDeleteLists(listid, 1); if(!children.empty()) { for(int i=0;i<4;i++) { delete children[i]; } } tree->item_count -= items.size(); items.clear(); tree->node_count--; } int QuadNode::usedChildren() { int populated = 0; if(!children.empty()) { for(int i=0;i<4;i++) { if(!children[i]->empty()) populated++; } } return populated; } int QuadNode::draw(Frustum& frustum) { if(listid && !items.empty()) { glPushMatrix(); glCallList(listid); glPopMatrix(); return 1; } int drawn = 0; if(!children.empty()) { for(int i=0;i<4;i++) { QuadNode* c = children[i]; if(!c->empty() && frustum.intersects(c->bounds)) { drawn += c->draw(frustum); } } } return drawn; } void QuadNode::generateLists() { if(!items.empty()) { if(!listid) listid = glGenLists(1); glNewList(listid, GL_COMPILE); for(std::list::iterator it = items.begin(); it != items.end(); it++) { QuadItem* oi = (*it); oi->drawQuadItem(); } glEndList(); return; } if(!children.empty()) { for(int i=0;i<4;i++) { QuadNode* c = children[i]; if(!c->empty()) { c->generateLists(); } } } } void QuadNode::outline() { //bounds.draw(); if(!items.empty()) { bounds.draw(); /*glBegin(GL_LINES); glVertex2fv(bounds.min); glVertex2fv(bounds.max); glEnd();*/ } if(children.empty()) return; for(int i=0;i<4;i++) { QuadNode* c = children[i]; if(c!=0) { c->outline(); } } } void QuadNode::outlineItems() { if(items.empty() && children.empty()) return; for(std::list::iterator it = items.begin(); it != items.end(); it++) { QuadItem* oi = (*it); oi->quadItemBounds.draw(); } if(children.empty()) return; for(int i=0;i<4;i++) { QuadNode* c = children[i]; if(c!=0) { c->outlineItems(); } } } //Quad TREE QuadTree::QuadTree(Bounds2D bounds, int max_node_depth, int max_node_items) { item_count = 0; node_count = 0; unique_item_count = 0; this->max_node_depth = max_node_depth; this->max_node_items = max_node_items; root = new QuadNode(this, 0, bounds, 0); } QuadTree::~QuadTree() { delete root; } int QuadTree::getItemsAt(std::set& itemset, vec2 pos) { int return_count = root->getItemsAt(itemset, pos); return return_count; } int QuadTree::getItemsInFrustum(std::set& itemset, Frustum& frustum) { return root->getItemsInFrustum(itemset, frustum); } int QuadTree::getItemsInBounds(std::set& itemset, Bounds2D& bounds) const{ return root->getItemsInBounds(itemset, bounds); } void QuadTree::getLeavesInFrustum(std::set& nodeset, Frustum& frustum) { return root->getLeavesInFrustum(nodeset, frustum); } void QuadTree::visitItemsAt(const vec2 & pos, VisitFunctor & visit){ return root->visitItemsAt(pos, visit); } void QuadTree::visitItemsInFrustum(const Frustum & frustum, VisitFunctor & visit){ root->visitItemsInFrustum(frustum, visit); } void QuadTree::visitItemsInBounds(const Bounds2D & bounds, VisitFunctor & visit){ root->visitItemsInBounds(bounds, visit); } void QuadTree::visitLeavesInFrustum(const Frustum& frustum, VisitFunctor & visit){ root->visitLeavesInFrustum(frustum, visit); } void QuadTree::addItem(QuadItem* item) { item->node_count = 0; root->addItem(item); unique_item_count++; } int QuadTree::drawNodesInFrustum(Frustum& frustum) { return root->draw(frustum); } void QuadTree::generateLists() { root->generateLists(); } void QuadTree::outline() { root->outline(); } void QuadTree::outlineItems() { root->outlineItems(); } gource-0.54/src/core/resource.h0000644002342600234260000000540214362112041016300 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef RESOURCEMANAGER_H #define RESOURCEMANAGER_H #include #include #include class ResourceException : public std::exception { protected: std::string resource; public: ResourceException(const std::string& resource) : resource(resource) {} virtual ~ResourceException() throw () {}; virtual const char* what() const throw() { return resource.c_str(); } }; class Resource { int refs; public: std::string resource_name; Resource() { refs =0; }; Resource(const std::string& resource_name) : resource_name(resource_name), refs(0) {}; virtual ~Resource() {}; void setResourceName(const std::string& resource_name) { if(this->resource_name.empty()) this->resource_name = resource_name; }; int refcount() { return refs; }; void addref() { refs++; }; void deref() { refs--; }; }; class ResourceManager { protected: std::map resources; std::string resource_dir; public: void setDir(const std::string& resource_dir); std::string getDir(); ResourceManager(); virtual ~ResourceManager(); static bool fileExists(const std::string& filename); static bool dirExists(const std::string& dirname); void purge(); void release(Resource* resource); }; #endif gource-0.54/src/core/conffile.h0000644002342600234260000001330114362112041016233 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef CONF_FILE_H #define CONF_FILE_H #include #include #include #include #include #include #include "vectors.h" class ConfFileException : public std::exception { protected: std::string errmsg; public: ConfFileException(const std::string& errmsg, const std::string& conffile, int lineno = 0) : errmsg(errmsg), conffile(conffile), lineno(lineno) {} std::string conffile; int lineno; virtual ~ConfFileException() throw () {}; virtual const char* what() const throw() { return errmsg.c_str(); } }; class ConfEntry { std::string name; std::string value; int lineno; public: ConfEntry(); ConfEntry(const std::string& name); ConfEntry(const std::string& name, const std::string& value, int lineno = 0); ConfEntry(const std::string& name, int value); ConfEntry(const std::string& name, float value); ConfEntry(const std::string& name, bool value); ConfEntry(const std::string& name, vec2 value); ConfEntry(const std::string& name, vec3 value); ConfEntry(const std::string& name, vec4 value); void setName(const std::string& name); void setString(const std::string& value); void setFloat(float value); void setInt(int value); void setBool(bool value); void setVec2(vec2 value); void setVec3(vec3 value); void setVec4(vec4 value); bool hasValue(); int getLineNumber(); std::string getName(); std::string getString(); int getInt(); float getFloat(); bool getBool(); vec2 getVec2(); vec3 getVec3(); vec4 getVec4(); bool isFloat(); bool isInt(); bool isBool(); bool isVec2(); bool isVec3(); bool isVec4(); }; typedef std::list ConfEntryList; class ConfFile; class ConfSection { std::map entrymap; std::string name; int lineno; ConfFile* conf; public: ConfSection(); ConfSection(const std::string& name, int lineno = 0); ~ConfSection(); void clear(); ConfFile* getConfFile(); ConfEntry* getEntry(const std::string& key); ConfEntryList* getEntries(const std::string& key); void setConfFile(ConfFile* conf); void sectionException(ConfEntry* entry, std::string reason); std::string getName(); int getLineNumber(); bool hasValue(const std::string& key); std::string getString(const std::string& key); int getInt(const std::string& key); float getFloat(const std::string& key); bool getBool(const std::string& key); vec3 getVec3(const std::string& key); vec4 getVec4(const std::string& key); void print(std::ostream& out); void setEntry(ConfEntry* entry); void addEntry(ConfEntry* entry); void setEntry(const std::string& name, const std::string& value, int lineno=0); void addEntry(const std::string& name, const std::string& value, int lineno=0); }; typedef std::list ConfSectionList; class ConfFile { std::string conffile; std::map sectionmap; public: ConfFile(); ~ConfFile(); void clear(); void setFilename(const std::string& filename); std::string getFilename(); void load(const std::string& conffile); void load(); void save(const std::string& conffile); void save(); bool hasSection(const std::string& section); ConfSection* getSection(const std::string& section); ConfSectionList* getSections(const std::string& section); ConfEntry* getEntry(const std::string& section, const std::string& key); ConfEntryList* getEntries(const std::string& section, const std::string& key); void addSection(ConfSection* section); ConfSection* addSection(const std::string& section); void setSection(ConfSection* section); int countSection(const std::string& section); void setEntry(const std::string& section, const std::string& key, const std::string& value); bool hasEntry(const std::string& section, const std::string& key); bool hasValue(const std::string& section, const std::string& key); std::string getString(const std::string& section, const std::string& key); int getInt(const std::string& section, const std::string& key); float getFloat(const std::string& section, const std::string& key); bool getBool(const std::string& section, const std::string& key); vec3 getVec3(const std::string& section, const std::string& key); vec4 getVec4(const std::string& section, const std::string& key); static void trim(std::string& value); void unknownOptionException(ConfEntry* entry); void missingValueException(ConfEntry* entry); void invalidValueException(ConfEntry* entry); void missingEntryException(ConfSection* section, std::string entryname); void sectionException(ConfSection* section, std::string reason); void entryException(ConfEntry* entry, std::string reason); }; #endif gource-0.54/src/core/mousecursor.cpp0000644002342600234260000001257014362112041017376 0ustar andrewcandrewc/* Copyright (c) 2010 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "mousecursor.h" MouseCursor::MouseCursor() { system_cursor = true; cursortex = 0; hidden = false; timeout = 3.0f; idle = timeout; scrollwheel = 0; left_click = false; right_click = false; middle_click = false; sdl_default_cursor = SDL_GetCursor(); Uint8 data[4*32]; Uint8 mask[4*32]; memset(data, 0, sizeof(data)); memset(mask, 0, sizeof(mask)); sdl_hidden_cursor = SDL_CreateCursor(data, mask, 32, 32, 0, 0); } MouseCursor::~MouseCursor() { SDL_SetCursor(sdl_default_cursor); SDL_FreeCursor(sdl_hidden_cursor); } void MouseCursor::useSystemCursor(bool system_cursor) { this->system_cursor = system_cursor; if(!hidden) { if(system_cursor) SDL_SetCursor(sdl_default_cursor); else SDL_SetCursor(sdl_hidden_cursor); } else { SDL_SetCursor(sdl_hidden_cursor); } } void MouseCursor::showCursor(bool show) { if(this->hidden == !show) return; this->hidden = !show; if(show) idle = 0.0; if(system_cursor) { if(show) SDL_SetCursor(sdl_default_cursor); else SDL_SetCursor(sdl_hidden_cursor); } } const vec2& MouseCursor::getPos() const { return mousepos; } const vec2& MouseCursor::getRelativePos() const { return rel; } void MouseCursor::updateRelativePos(const vec2& rel) { this->rel = rel; } void MouseCursor::leftClick(bool click) { left_click = click; } void MouseCursor::rightClick(bool click) { right_click = click; } void MouseCursor::middleClick(bool click) { middle_click = click; } bool MouseCursor::leftClick() const { return left_click; } bool MouseCursor::rightClick() const { return right_click; } bool MouseCursor::middleClick() const { return middle_click; } bool MouseCursor::leftButtonPressed() const { Uint8 ms = SDL_GetMouseState(0,0); return ms & SDL_BUTTON(SDL_BUTTON_LEFT); } bool MouseCursor::rightButtonPressed() const { Uint8 ms = SDL_GetMouseState(0,0); return ms & SDL_BUTTON(SDL_BUTTON_RIGHT); } bool MouseCursor::bothPressed() const { Uint8 ms = SDL_GetMouseState(0,0); return (ms & SDL_BUTTON(SDL_BUTTON_RIGHT) && ms & SDL_BUTTON(SDL_BUTTON_LEFT)); } bool MouseCursor::buttonPressed() const { Uint8 ms = SDL_GetMouseState(0,0); return (ms & SDL_BUTTON(SDL_BUTTON_RIGHT) || ms & SDL_BUTTON(SDL_BUTTON_LEFT)); } int MouseCursor::scrollWheel() const { return scrollwheel; } bool MouseCursor::isSystemCursor() const { return system_cursor; } bool MouseCursor::isHidden() const { return hidden; } bool MouseCursor::isVisible() const { return (!hidden && idle < timeout && hasFocus()); } bool MouseCursor::hasFocus() const { #if SDL_VERSION_ATLEAST(2,0,0) return (SDL_GetMouseFocus() == display.sdl_window); #else return (SDL_GetAppState() & SDL_APPMOUSEFOCUS); #endif } void MouseCursor::setCursorTexture(TextureResource* texture) { cursortex = texture; } void MouseCursor::updatePos(const vec2& pos) { mousepos = pos; idle = 0.0f; } void MouseCursor::scroll(bool dir) { scrollwheel += dir ? 1 : -1; } void MouseCursor::resetButtonState() { scrollwheel = 0; right_click = false; left_click = false; middle_click = false; } void MouseCursor::logic(float dt) { idle += dt; } void MouseCursor::draw() const { if(system_cursor || cursortex == 0) return; if(!isVisible()) return; glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); cursortex->bind(); glTranslatef(mousepos.x, mousepos.y, 0.0f); glPushMatrix(); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex2i(0, 0); glTexCoord2f(1.0f,0.0f); glVertex2i(cursortex->w, 0); glTexCoord2f(1.0f,1.0f); glVertex2i(cursortex->w, cursortex->h); glTexCoord2f(0.0f,1.0f); glVertex2i(0, cursortex->h); glEnd(); glPopMatrix(); } gource-0.54/src/core/png_writer.h0000644002342600234260000000550714362112041016637 0ustar andrewcandrewc/* Copyright (c) 2013 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PNG_WRITER_H #define PNG_WRITER_H #include "SDL_thread.h" #include #include class PNGWriter { protected: std::ostream* out; size_t components; void init(); public: PNGWriter(int components = 3); bool open(const std::string& filename); void close(); void setOutputStream(std::ostream* out); void screenshot(const std::string& filename); void capture(std::vector& buffer); void writePNG(std::vector& buffer); }; enum png_exporter_state { PNG_EXPORTER_WAIT, PNG_EXPORTER_WRITE, PNG_EXPORTER_EXIT, PNG_EXPORTER_STOPPED }; class PNGExporter { protected: PNGWriter writer; std::vector* buffer_shared_ptr; std::vector buffer1; std::vector buffer2; SDL_cond* cond; SDL_mutex* mutex; SDL_Thread* thread; int thread_state; std::string filename; static int startThread(void *exporter); public: PNGExporter(const std::string& filename); ~PNGExporter(); void run(); void stop(); void capture(); }; class PNGExporterException : public std::exception { protected: std::string filename; public: PNGExporterException(const std::string& filename) : filename(filename) {}; virtual ~PNGExporterException() throw () {}; virtual const char* what() const throw() { return filename.c_str(); }; }; #endif gource-0.54/src/core/sdlapp.cpp0000644002342600234260000003035314362112041016272 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "sdlapp.h" #include "display.h" #include "logger.h" #include "SDL_syswm.h" #ifndef _MSC_VER #include #endif std::string gSDLAppResourceDir; std::string gSDLAppConfDir; #ifdef _WIN32 std::string gSDLAppPathSeparator = "\\"; #else std::string gSDLAppPathSeparator = "/"; #endif std::string gSDLAppTitle = "SDL App"; std::string gSDLAppExec = "sdlapp"; #ifdef _WIN32 HWND SDLApp::console_window = 0; bool SDLApp::existing_console = false; void SDLApp::showConsole(bool show) { if(!SDLApp::console_window) return; ShowWindow( SDLApp::console_window, show); } void SDLApp::initConsole() { if(SDLApp::console_window != 0) return; SDLApp::console_window = GetConsoleWindow(); // check if this is a new console or not CONSOLE_SCREEN_BUFFER_INFO buffer_info; if(GetConsoleScreenBufferInfo( GetStdHandle( STD_OUTPUT_HANDLE ), &buffer_info )) { existing_console = !(buffer_info.dwCursorPosition.X==0 && buffer_info.dwCursorPosition.Y==0); // assume TERM env implies this is an existing terminal } else if(getenv("TERM") != 0) { existing_console = true; } // don't customize the console unless it was created for this program if(existing_console) return; //disable the close button so the user cant crash the application HMENU hm = GetSystemMenu(SDLApp::console_window, false); DeleteMenu(hm, SC_CLOSE, MF_BYCOMMAND); //set title char consoleTitle[512]; int console_suffix = 0; sprintf(consoleTitle, "%s Console", gSDLAppTitle.c_str()); while(FindWindow(0, consoleTitle)) { sprintf(consoleTitle, "%s Console %d", gSDLAppTitle.c_str(), ++console_suffix); } SetConsoleTitle(consoleTitle); } void SDLApp::resizeConsole(int height) { if(SDLApp::console_window !=0 && !existing_console) { RECT windowRect; if(GetWindowRect(SDLApp::console_window, &windowRect)) { float width = windowRect.right - windowRect.left; MoveWindow(SDLApp::console_window,windowRect.left,windowRect.top,width,height,true); } } } #endif std::string SDLAppAddSlash(std::string path) { //append slash unless the path is empty if(path.size() && path[path.size()-1] != gSDLAppPathSeparator[0]) { path += gSDLAppPathSeparator; } return path; } //info message void SDLAppInfo(std::string msg) { #ifdef _WIN32 SDLApp::showConsole(true); #endif printf("%s\n", msg.c_str()); #ifdef _WIN32 if(!SDLApp::existing_console) { printf("\nPress Enter\n"); getchar(); } #endif exit(0); } //display error only void SDLAppQuit(std::string error) { SDL_Quit(); #ifdef _WIN32 SDLApp::showConsole(true); #endif fprintf(stderr, "%s: %s\n", gSDLAppExec.c_str(), error.c_str()); fprintf(stderr, "Try '%s --help' for more information.\n\n", gSDLAppExec.c_str()); #ifdef _WIN32 if(!SDLApp::existing_console) { fprintf(stderr, "Press Enter\n"); getchar(); } #endif exit(1); } bool SDLApp::getClipboardText(std::string& text) { #if SDL_VERSION_ATLEAST(2,0,0) char* clipboard_text = SDL_GetClipboardText(); if(clipboard_text!=0) { text = std::string(clipboard_text); } else { text.resize(0); } return true; #else return false; #endif } void SDLApp::setClipboardText(const std::string& text) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_SetClipboardText(text.c_str()); #endif } void SDLAppInit(std::string apptitle, std::string execname, std::string exepath) { gSDLAppTitle = apptitle; gSDLAppExec = execname; std::string conf_dir = ""; std::string resource_dir = "data/"; std::string fonts_dir = "data/fonts/"; std::string shaders_dir = "data/shaders/"; #ifdef _WIN32 char szAppPath[MAX_PATH]; GetModuleFileName(0, szAppPath, MAX_PATH); // Extract directory std::string winexepath = std::string(szAppPath); int pos = winexepath.rfind("\\"); std::string path = winexepath.substr(0, pos+1); conf_dir = path + std::string("\\"); resource_dir = path + std::string("\\data\\"); fonts_dir = path + std::string("\\data\\fonts\\"); shaders_dir = path + std::string("\\data\\shaders\\"); #else //get working directory char cwd_buff[1024]; if(getcwd(cwd_buff, 1024) == cwd_buff) { conf_dir = std::string(cwd_buff) + std::string("/"); resource_dir = std::string(cwd_buff) + std::string("/") + resource_dir; fonts_dir = std::string(cwd_buff) + std::string("/") + fonts_dir; shaders_dir = std::string(cwd_buff) + std::string("/") + shaders_dir; } #endif #ifdef SDLAPP_CONF_DIR if (ResourceManager::dirExists(SDLAPP_CONF_DIR)) { conf_dir = SDLAPP_CONF_DIR; } #endif #ifdef SDLAPP_RESOURCE_DIR if (ResourceManager::dirExists(SDLAPP_RESOURCE_DIR)) { resource_dir = SDLAPP_RESOURCE_DIR; fonts_dir = SDLAPP_RESOURCE_DIR + std::string("/fonts/"); shaders_dir = SDLAPP_RESOURCE_DIR + std::string("/shaders/"); } else if(!exepath.empty()) { // make resource path relative to the directory of the executable // if the resource directory doesn't exist size_t pos = exepath.rfind("/"); if (pos != std::string::npos) { std::string path = exepath.substr(0, pos+1); resource_dir = path + std::string("data/"); fonts_dir = path + std::string("data/fonts/"); shaders_dir = path + std::string("data/shaders/"); } } #endif #ifdef SDLAPP_FONT_DIR if (ResourceManager::dirExists(SDLAPP_FONT_DIR)) { fonts_dir = SDLAPP_FONT_DIR; } #endif resource_dir = SDLAppAddSlash(resource_dir); conf_dir = SDLAppAddSlash(conf_dir); fonts_dir = SDLAppAddSlash(fonts_dir); shaders_dir = SDLAppAddSlash(shaders_dir); texturemanager.setDir(resource_dir); fontmanager.setDir(fonts_dir); shadermanager.setDir(shaders_dir); gSDLAppResourceDir = resource_dir; gSDLAppConfDir = conf_dir; gSDLAppShaderDir = shaders_dir; fontmanager.init(); } void SDLAppParseArgs(int argc, char *argv[], int* xres, int* yres, bool* fullscreen, std::vector* otherargs) { for (int i=1; i1 && args[0] == '-' && args.rfind("x") != std::string::npos) { std::string displayarg = args; while(displayarg.size()>1 && displayarg[0] == '-') { displayarg = displayarg.substr(1, displayarg.size()-1); } size_t x = displayarg.rfind("x"); if(x != std::string::npos) { std::string widthstr = displayarg.substr(0, x); std::string heightstr = displayarg.substr(x+1); int width = atoi(widthstr.c_str()); int height = atoi(heightstr.c_str()); if(width>0 && height>0) { debugLog("w=%d, h=%d",width,height); *xres = width; *yres = height; continue; } } } // non display argument if(otherargs != 0) { otherargs->push_back(args); } } } SDLApp::SDLApp() { fps=0; return_code=0; appFinished=false; min_delta_msec = 8; } void SDLApp::updateFramerate() { if(fps_updater>0) { fps = (float)frame_count / (float)fps_updater * 1000.0f; } else { fps = 0; } fps_updater = 0; frame_count = 0; } bool SDLApp::isFinished() { return appFinished; } int SDLApp::returnCode() { return return_code; } void SDLApp::stop(int return_code) { this->return_code = return_code; appFinished=true; } bool SDLApp::handleEvent(SDL_Event& event) { switch(event.type) { case SDL_QUIT: quit(); break; case SDL_MOUSEMOTION: { SDL_MouseMotionEvent motion = event.motion; motion.x *= display.viewport_dpi_ratio.x; motion.y *= display.viewport_dpi_ratio.y; motion.xrel *= display.viewport_dpi_ratio.x; motion.yrel *= display.viewport_dpi_ratio.y; mouseMove(&motion); break; } #if SDL_VERSION_ATLEAST(2,0,0) case SDL_TEXTINPUT: textInput(&event.text); break; case SDL_TEXTEDITING: textEdit(&event.edit); break; case SDL_MOUSEWHEEL: mouseWheel(&event.wheel); break; case SDL_WINDOWEVENT: if(event.window.event == SDL_WINDOWEVENT_RESIZED) { resize(event.window.data1, event.window.data2); } break; #else case SDL_VIDEORESIZE: resize(event.resize.w, event.resize.h); break; #endif case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { SDL_MouseButtonEvent button = event.button; button.x *= display.viewport_dpi_ratio.x; button.y *= display.viewport_dpi_ratio.y; mouseClick(&button); break; } case SDL_KEYDOWN: case SDL_KEYUP: keyPress(&event.key); break; default: return false; } return true; } int SDLApp::run() { Uint32 msec=0, last_msec=0, buffer_msec=0, total_msec = 0; frame_count = 0; fps_updater = 0; if(!appFinished) init(); msec = SDL_GetTicks(); last_msec = msec; #if SDL_VERSION_ATLEAST(2,0,0) //text input seems to be enabled by default, turn it off SDL_StopTextInput(); #endif while(!appFinished) { last_msec = msec; msec = SDL_GetTicks(); Uint32 delta_msec = msec - last_msec; // cant have delta ticks be less than 8ms buffer_msec += delta_msec; if(buffer_msec < min_delta_msec) { SDL_Delay(1); continue; } delta_msec = buffer_msec; buffer_msec =0; //determine time elapsed since last time we were here total_msec += delta_msec; float t = total_msec / 1000.0f; float dt = delta_msec / 1000.0f; fps_updater += delta_msec; //update framerate if a second has passed if (fps_updater >= 1000) { updateFramerate(); } //process new events SDL_Event event; while ( SDL_PollEvent(&event) ) { handleEvent(event); } update(t, dt); //update display display.update(); frame_count++; } return return_code; } gource-0.54/src/core/resource.cpp0000644002342600234260000000522114362112041016632 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "resource.h" #include ResourceManager::ResourceManager() { } std::string ResourceManager::getDir() { return resource_dir; } void ResourceManager::setDir(const std::string& resource_dir) { this->resource_dir = resource_dir; } void ResourceManager::purge() { //free all resources - should be called BEFORE SDL_QUIT ... for(std::map::iterator it= resources.begin(); it!=resources.end();it++) { delete it->second; } resources.clear(); } ResourceManager::~ResourceManager() { } bool ResourceManager::fileExists(const std::string& filename) { return boost::filesystem::is_regular_file(filename); } bool ResourceManager::dirExists(const std::string& dirname) { return boost::filesystem::is_directory(dirname); } void ResourceManager::release(Resource* resource) { Resource* r = resources[resource->resource_name]; if(r==0) return; //debugLog("decrementing ref count for %s\n", name.c_str()); r->deref(); if(r->refcount()<=0) { //debugLog("no refs to %s, deleting\n", name.c_str()); resources.erase(r->resource_name); //sufficient? delete r; } } gource-0.54/src/core/texture.h0000644002342600234260000000626614362112041016162 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef TEXTURE_H #define TEXTURE_H #include "SDL_image.h" #include "resource.h" #include "gl.h" #include class TextureException : public ResourceException { public: TextureException(std::string& texture_file) : ResourceException(texture_file) {} }; class TextureResource : public Resource { bool mipmaps; GLint wrap; GLint min_filter; GLint mag_filter; std::string filename; GLenum colourFormat(SDL_Surface* surface); public: int w, h; GLenum target; GLenum format; GLuint textureid; GLubyte* data; TextureResource(); TextureResource(int width, int height, bool mipmaps, GLint wrap, GLenum format, GLubyte* data = 0); TextureResource(const std::string& filename, bool mipmaps, GLint wrap, bool external); void setWrapStyle(GLint wrap); void setFiltering(GLint min_filter, GLint mag_filter); void setDefaultFiltering(); void bind(); void createTexture(); void reload(); void load(bool reload = false); void unload(); ~TextureResource(); }; class TextureManager : public ResourceManager { int resource_seq; void addResource(TextureResource* r); public: bool trilinear; TextureManager(); TextureResource* grabFile(const std::string& filename, bool mipmaps = true, GLint wrap = GL_CLAMP_TO_EDGE); TextureResource* grab(const std::string& filename, bool mipmaps = true, GLint wrap = GL_CLAMP_TO_EDGE, bool external_file = false); TextureResource* create(int width, int height, bool mipmaps, GLint wrap, GLenum format, GLubyte* data = 0); TextureResource* create(GLenum target = GL_TEXTURE_2D); void unload(); void reload(); }; extern TextureManager texturemanager; #endif gource-0.54/src/core/bounds.h0000644002342600234260000001213214362112041015741 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef BOUNDS_H #define BOUNDS_H #include "display.h" #include "vectors.h" class Bounds2D { public: vec2 min; vec2 max; bool first; vec2 centre() const { return min + (max - min) * 0.5f; } float width() const { return max.x - min.x; } float height() const { return max.y - min.y; } float area() const { return width() * height(); } void reset() { min = vec2(0.0, 0.0); max = vec2(0.0, 0.0); first = true; } Bounds2D() { reset(); } Bounds2D(const vec2& min, const vec2& max) { reset(); update(min); update(max); } void update(const Bounds2D& bounds) { update(bounds.min); update(bounds.max); } void set(const Bounds2D& bounds) { reset(); update(bounds); } void set(vec2 point) { reset(); update(point); } void set(const vec2& a, const vec2& b) { reset(); update(a); update(b); } void update(const vec2& point) { if(first) { min = point; max = point; first=false; return; } if(min.x > point.x) min.x = point.x; if(min.y > point.y) min.y = point.y; if(max.x < point.x) max.x = point.x; if(max.y < point.y) max.y = point.y; } bool contains(const vec2& point) const { if(first) return false; if(min.x<=point.x && min.y<=point.y && max.x >= point.x && max.y >= point.y) return true; return false; } bool overlaps(const Bounds2D & b) const { if(max.y < b.min.y) return false; if(min.y > b.max.y) return false; if(max.x < b.min.x) return false; if(min.x > b.max.x) return false; return true; } void draw() const{ glBegin(GL_LINE_STRIP); glVertex2fv(glm::value_ptr(min)); glVertex2f(max.x, min.y); glVertex2fv(glm::value_ptr(max)); glVertex2f(min.x, max.y); glVertex2fv(glm::value_ptr(min)); glEnd(); } }; class Bounds3D { public: vec3 min; vec3 max; bool first; void reset() { min = vec3(0.0, 0.0, 0.0); max = vec3(0.0, 0.0, 0.0); first = true; } Bounds3D() { reset(); } Bounds3D(vec3 min, vec3 max) { reset(); update(min); update(max); } float width() { return max.x - min.x; } float height() { return max.y - min.y; } float depth() { return max.z - min.z; } float area() { return width() * height() * depth(); } vec3 centre() { return min + ((max-min) * 0.5f); } void update(vec3 point) { if(first) { min = point; max = point; first = false; return; } if(min.x > point.x) min.x = point.x; if(min.y > point.y) min.y = point.y; if(min.z > point.z) min.z = point.z; if(max.x < point.x) max.x = point.x; if(max.y < point.y) max.y = point.y; if(max.z < point.z) max.z = point.z; } bool contains(vec3& point) { if(first) return false; if(min.x<=point.x && min.y<=point.y && min.z<=point.z && max.x >= point.x && max.y >= point.y && max.z >= point.z) return true; return false; } void draw() { glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glBegin(GL_LINES); glVertex3fv(glm::value_ptr(min)); glVertex3fv(glm::value_ptr(max)); glEnd(); } }; #endif gource-0.54/src/core/vbo.h0000644002342600234260000000747014362112041015246 0ustar andrewcandrewc/* Copyright (c) 2011 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CORE_VBO_H #define CORE_VBO_H #include #include #include "gl.h" #include "vectors.h" #include "logger.h" class VBO { public: GLuint id; GLenum buffer_type; int capacity; VBO(GLenum buffer_type = GL_ARRAY_BUFFER) : buffer_type(buffer_type) { capacity = 0; id = 0; } ~VBO() { unload(); } void init() { if(!id) glGenBuffers(1, &id); } void unload() { capacity = 0; if(id != 0) { glDeleteBuffers(1, &id); id = 0; } } void bind() { if(!id) init(); glBindBuffer(buffer_type, id); } void buffer(int item_count, int item_size, int item_capacity, GLvoid* data, GLenum usage) { bind(); if(capacity < item_count) { capacity = item_capacity; glBufferData(buffer_type, capacity * item_size, data, usage); } else { glBufferSubData(buffer_type, 0, item_count * item_size, data); } unbind(); } void unbind() { glBindBuffer(buffer_type, 0); } }; //note this should be 32 bytes (8x4 bytes) class quadbuf_vertex { public: quadbuf_vertex() {}; quadbuf_vertex(const vec2& pos, const vec4& colour, const vec2& texcoord) : pos(pos), colour(colour), texcoord(texcoord) {}; vec2 pos; vec4 colour; vec2 texcoord; }; //maintain ranges corresponding to each texture class quadbuf_tex { public: quadbuf_tex() {}; quadbuf_tex(int start_index, GLuint textureid) : start_index(start_index), textureid(textureid) {}; int start_index; GLuint textureid; }; class quadbuf { quadbuf_vertex* data; int vertex_capacity; std::vector textures; VBO buf; int vertex_count; void resize(int new_size); public: quadbuf(int data_size = 0); ~quadbuf(); void unload(); void reset(); size_t vertices(); size_t capacity(); size_t texture_changes(); void add(GLuint textureid, const vec2& pos, const vec2& dims, const vec4& colour); void add(GLuint textureid, const vec2& pos, const vec2& dims, const vec4& colour, const vec4& texcoord); void add(GLuint textureid, const quadbuf_vertex& v1, const quadbuf_vertex& v2, const quadbuf_vertex& v3, const quadbuf_vertex& v4); void update(); void draw(); }; #endif gource-0.54/src/core/settings.h0000644002342600234260000000410714362112041016312 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef SDLAPP_SETTINGS_H #define SDLAPP_SETTINGS_H #include "conffile.h" #include #include #include class SDLAppSettings { protected: std::string default_section_name; std::map arg_types; std::map arg_aliases; std::map conf_sections; virtual void commandLineOption(const std::string& name, const std::string& value) {} bool parseRectangle(const std::string& value, int& x, int& y); bool parseViewport(const std::string& value, int& x, int& y, bool& no_resize); public: int display_width; int display_height; int window_x; int window_y; int screen; bool viewport_specified; bool multisample; bool fullscreen; bool frameless; bool transparent; bool resizable; bool vsync; bool high_dpi; std::string output_ppm_filename; int output_framerate; SDLAppSettings(); static bool parseDateTime(const std::string& datetime, time_t& timestamp); void parseArgs(int argc, char *argv[], ConfFile& conffile, std::vector* files = 0); void parseArgs(const std::vector& args, ConfFile& conffile, std::vector* files = 0); void exportDisplaySettings(ConfFile& conf); void importDisplaySettings(ConfFile& conf); void setDisplayDefaults(); }; #endif gource-0.54/src/core/pi.h0000644002342600234260000000315614362112041015065 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PI_H #define PI_H #define PI 3.14159265 #define RADIANS_TO_DEGREES 57.29577951 #define DEGREES_TO_RADIANS 0.017453292 #endif gource-0.54/src/core/tga.h0000644002342600234260000000623614362112041015232 0ustar andrewcandrewc/* Copyright (c) 2012 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef TGA_WRITER_H #define TGA_WRITER_H #include "SDL_thread.h" #include #include #include #include class TGAWriter { protected: bool rle; size_t components; size_t rle_count; size_t raw_count; std::ostream* out; void writeHeader(); inline void writeRLE(int pixel_count, const char* pixel); inline void writeRaw(std::vector& buffer, int start, int pixel_count); void writeScanlines(std::vector& buffer, int width, int height); void init(); public: TGAWriter(int components = 3); bool open(const std::string& filename); void close(); void setOutputStream(std::ostream* out); void screenshot(const std::string& filename); void capture(std::vector& buffer); void writeTGA(std::vector& buffer); }; enum tga_exporter_state { TGA_EXPORTER_WAIT, TGA_EXPORTER_WRITE, TGA_EXPORTER_EXIT, TGA_EXPORTER_STOPPED }; class TGAExporter { protected: TGAWriter writer; std::vector* buffer_shared_ptr; std::vector buffer1; std::vector buffer2; SDL_cond* cond; SDL_mutex* mutex; SDL_Thread* thread; int thread_state; std::string filename; static int startThread(void *exporter); public: TGAExporter(const std::string& filename); ~TGAExporter(); void run(); void stop(); void capture(); }; class TGAExporterException : public std::exception { protected: std::string filename; public: TGAExporterException(const std::string& filename) : filename(filename) {}; virtual ~TGAExporterException() throw () {}; virtual const char* what() const throw() { return filename.c_str(); }; }; #endif gource-0.54/src/core/ftgl/0000755002342600234260000000000014362112041015233 5ustar andrewcandrewcgource-0.54/src/core/ftgl/FTUnicode.h0000644002342600234260000001773414362112041017240 0ustar andrewcandrewc/* * FTGL - OpenGL font library * * Copyright (c) 2008 Daniel Remenak * * Portions derived from ConvertUTF.c Copyright (C) 2001-2004 Unicode, Inc * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. * * 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __FTUnicode__ #define __FTUnicode__ /** * Provides a way to easily walk multibyte unicode strings in the various * Unicode encodings (UTF-8, UTF-16, UTF-32, UCS-2, and UCS-4). Encodings * with elements larger than one byte must already be in the correct endian * order for the current architecture. */ template class FTUnicodeStringItr { public: /** * Constructor. Also reads the first character and stores it. * * @param string The buffer to iterate. No copy is made. */ FTUnicodeStringItr(const T* string) : curPos(string), nextPos(string) { (*this)++; }; /** * Pre-increment operator. Reads the next unicode character and sets * the state appropriately. * Note - not protected against overruns. */ FTUnicodeStringItr& operator++() { curPos = nextPos; // unicode handling switch (sizeof(T)) { case 1: // UTF-8 // get this character readUTF8(); break; case 2: // UTF-16 readUTF16(); break; case 4: // UTF-32 // fall through default: // error condition really, but give it a shot anyway curChar = *nextPos++; } return *this; } /** * Post-increment operator. Reads the next character and sets * the state appropriately. * Note - not protected against overruns. */ FTUnicodeStringItr operator++(int) { FTUnicodeStringItr temp = *this; ++*this; return temp; } /** * Equality operator. Two FTUnicodeStringItrs are considered equal * if they have the same current buffer and buffer position. */ bool operator==(const FTUnicodeStringItr& right) const { if (curPos == right.getBufferFromHere()) return true; return false; } /** * Dereference operator. * * @return The unicode codepoint of the character currently pointed * to by the FTUnicodeStringItr. */ unsigned int operator*() const { return curChar; } /** * Buffer-fetching getter. You can use this to retreive the buffer * starting at the currently-iterated character for functions which * require a Unicode string as input. */ const T* getBufferFromHere() const { return curPos; } private: /** * Helper function for reading a single UTF8 character from the string. * Updates internal state appropriately. */ void readUTF8(); /** * Helper function for reading a single UTF16 character from the string. * Updates internal state appropriately. */ void readUTF16(); /** * The buffer position of the first element in the current character. */ const T* curPos; /** * The character stored at the current buffer position (prefetched on * increment, so there's no penalty for dereferencing more than once). */ unsigned int curChar; /** * The buffer position of the first element in the next character. */ const T* nextPos; // unicode magic numbers static const char utf8bytes[256]; static const unsigned long offsetsFromUTF8[6]; static const unsigned long highSurrogateStart; static const unsigned long highSurrogateEnd; static const unsigned long lowSurrogateStart; static const unsigned long lowSurrogateEnd; static const unsigned long highSurrogateShift; static const unsigned long lowSurrogateBase; }; /* The first character in a UTF8 sequence indicates how many bytes * to read (among other things) */ template const char FTUnicodeStringItr::utf8bytes[256] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,5,5,5,5,6,6,6,6 }; /* Magic values subtracted from a buffer value during UTF8 conversion. * This table contains as many values as there might be trailing bytes * in a UTF-8 sequence. */ template const unsigned long FTUnicodeStringItr::offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; // get a UTF8 character; leave the tracking pointer at the start of the // next character // not protected against invalid UTF8 template inline void FTUnicodeStringItr::readUTF8() { unsigned int ch = 0; unsigned int extraBytesToRead = utf8bytes[(unsigned char)(*nextPos)]; // falls through switch (extraBytesToRead) { case 6: ch += *nextPos++; ch <<= 6; /* remember, illegal UTF-8 */ case 5: ch += *nextPos++; ch <<= 6; /* remember, illegal UTF-8 */ case 4: ch += *nextPos++; ch <<= 6; case 3: ch += *nextPos++; ch <<= 6; case 2: ch += *nextPos++; ch <<= 6; case 1: ch += *nextPos++; } ch -= offsetsFromUTF8[extraBytesToRead-1]; curChar = ch; } // Magic numbers for UTF-16 conversions template const unsigned long FTUnicodeStringItr::highSurrogateStart = 0xD800; template const unsigned long FTUnicodeStringItr::highSurrogateEnd = 0xDBFF; template const unsigned long FTUnicodeStringItr::lowSurrogateStart = 0xDC00; template const unsigned long FTUnicodeStringItr::lowSurrogateEnd = 0xDFFF; template const unsigned long FTUnicodeStringItr::highSurrogateShift = 10; template const unsigned long FTUnicodeStringItr::lowSurrogateBase = 0x0010000UL; template inline void FTUnicodeStringItr::readUTF16() { unsigned int ch = *nextPos++; // if we have the first half of the surrogate pair if (ch >= highSurrogateStart && ch <= highSurrogateEnd) { unsigned int ch2 = *curPos; // complete the surrogate pair if (ch2 >= lowSurrogateStart && ch2 <= lowSurrogateEnd) { ch = ((ch - highSurrogateStart) << highSurrogateShift) + (ch2 - lowSurrogateStart) + lowSurrogateBase; ++nextPos; } } curChar = ch; } #endif gource-0.54/src/core/vectors.h0000644002342600234260000000606414362112041016143 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef VECTORS_H #define VECTORS_H #define GLM_FORCE_RADIANS // the following are required for compatibility with GLM 0.9.9 #define GLM_FORCE_CTOR_INIT #define GLM_ENABLE_EXPERIMENTAL #include #include #include #include #include using glm::vec2; using glm::vec3; using glm::vec4; using glm::mat3; using glm::mat4; vec2 rotate_vec2(const vec2& v, float s, float c); vec2 normalise(const vec2& v); vec3 normalise(const vec3& v); vec4 normalise(const vec4& v); class lerp2 : public glm::vec2 { public: vec2 p; vec2 l; lerp2() : vec2(), p(), l() { } const lerp2& snap() { p = *this; return *this; } static vec2 lerp(const vec2& a, const vec2& b, float n) { return a + (b - a) * n; } const vec2& lerp(float n) { l = p + (*this - p) * n; return l; } const lerp2& operator= (const vec2& vec) { this->x = vec.x; this->y = vec.y; return *this; } }; class lerp3 : public vec3 { public: vec3 p; vec3 l; lerp3() : vec3(), p(), l() { } const lerp3& snap() { p = *this; return *this; } static vec3 lerp(const vec3& a, const vec3& b, float n) { return a + (b - a) * n; } const vec3& lerp(float n) { l = p + (*this - p) * n; return l; } const lerp3& operator= (const vec3& vec) { this->x = vec.x; this->y = vec.y; this->z = vec.z; return *this; } }; #endif gource-0.54/src/core/fxfont.h0000644002342600234260000001623014362112041015756 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Portions of this code are derivived from FTGL (FTTextureFont.cpp) FTGL - OpenGL font library Copyright (c) 2001-2004 Henry Maddocks Copyright (c) 2008 Sam Hocevar 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef FX_FONT_H #define FX_FONT_H #include "display.h" #include "vectors.h" #include "logger.h" #include "resource.h" #include "texture.h" #include "vbo.h" #include #include #include #include #include FT_FREETYPE_H #include FT_GLYPH_H #include "ftgl/FTUnicode.h" class FXFontException : public ResourceException { public: FXFontException(const std::string & font_file) : ResourceException(font_file) {} }; class FXGlyph; class FXGlyphSet; class FXGlyphPage { GLubyte* texture_data; bool needs_update; int page_width; int page_height; public: TextureResource* texture; FXGlyphPage(int page_width, int page_height); ~FXGlyphPage(); bool addGlyph(FXGlyph* glyph); void updateTexture(); int cursor_x, cursor_y; int max_glyph_height; }; class FXGlyph { unsigned int chr; vec2 dims; vec2 corner; vec2 advance; int height; public: vec2 vertex_positions[4]; vec2 vertex_texcoords[4]; FXGlyphPage* page; vec4 texcoords; FXGlyphSet* set; FT_Glyph ftglyph; FT_BitmapGlyph glyph_bitmap; FXGlyph(FXGlyphSet* set, unsigned int chr); ~FXGlyph(); const vec2& getAdvance() const { return advance; }; const vec2& getCorner() const { return corner; }; const vec2& getDimensions() const { return dims; }; int getHeight() const { return height; }; void setPage(FXGlyphPage* page, const vec4& texcoords); void drawToVBO(quadbuf& buffer, const vec2& offset, const vec4& colour) const; void draw(const vec2& pos) const; }; class FXGlyphSet { FT_Library freetype; FT_Face ft_face; FT_Int32 ft_flags; std::string fontfile; int max_height; int size; int dpi; float tab_width; vec2 unit_scale; bool pre_caching; std::vector pages; std::map glyphs; void init(); FXGlyph* getGlyph(unsigned int chr); public: FXGlyphSet(FT_Library freetype, const std::string& fontfile, int size, int dpi, FT_Int32 ft_flags); ~FXGlyphSet(); void precache(const std::string& chars); FT_Face getFTFace() const { return ft_face; } FT_Int32 getFlags() const { return ft_flags; } const std::string& getFontFile() const { return fontfile; } float getWidth(const std::string& text); float getAscender() const; float getDescender() const; float getMaxWidth() const; float getMaxHeight() const; int getSize() const { return size; }; void drawToVBO(vec2& cursor, const std::string& text, const vec4& colour); void draw(const std::string& text); void drawPages(); }; class FXFont { FXGlyphSet* glyphset; std::string fontfile; bool shadow; bool round; float shadow_strength; vec2 shadow_offset; vec4 shadow_colour; vec4 colour; bool align_right, align_top; void render(float x, float y, const std::string& text, const vec4& colour) const; void init(); public: FXFont(); FXFont(FXGlyphSet* glyphset); bool initialized() const { return (glyphset!=0); } void print(float x, float y, const char *str, ...) const; void draw(float x, float y, const std::string& text) const; float getWidth(const std::string& text) const; float getHeight() const; float getAscender() const; float getDescender() const; void alignTop(bool top); void alignRight(bool right); void roundCoordinates(bool round); const std::string& getFontFile() const; float getMaxWidth() const; float getMaxHeight() const; int getFontSize() const; bool dropShadow() const { return shadow; }; void dropShadow(bool shadow); void shadowStrength(float s); void shadowOffset(float x, float y); void setColour(const vec4& colour); void setAlpha(float alpha); void drawGlyphes(); }; typedef std::map fontSizeMap; class FXFontManager { std::string font_dir; std::map fonts; FT_Library library; public: quadbuf font_vbo; FXFontManager(); bool use_vbo; void setDir(std::string font_dir); void init(); void unload(); void reload(); void destroy(); void purge(); void startBuffer(); void commitBuffer(); void drawBuffer(); FXFont grab(std::string font_file, int size, int dpi = 72, FT_Int32 ft_flags = FT_LOAD_DEFAULT); }; extern FXFontManager fontmanager; #endif gource-0.54/src/core/seeklog.h0000644002342600234260000000550314362112041016104 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SEEK_LOG_H #define SEEK_LOG_H #include "display.h" #include "logger.h" #include #include #include #include class BaseLog { protected: std::istream* stream; public: virtual ~BaseLog() {}; virtual bool getNextLine(std::string& line) { return false; }; virtual bool isFinished() { return false; }; }; class StreamLog : public BaseLog { bool fcntl_fail; #ifdef _WIN32 void* stdin_handle; #endif public: StreamLog(); ~StreamLog(); bool getNextLine(std::string& line); bool isFinished(); }; class SeekLogException : public std::exception { protected: std::string filename; public: SeekLogException(std::string& filename) : filename(filename) {} virtual ~SeekLogException() throw () {}; virtual const char* what() const throw() { return filename.c_str(); } }; class SeekLog : public BaseLog { std::string logfile; long long file_size; float current_percent; bool readFully(); public: SeekLog(std::string logfile); ~SeekLog(); void setPointer(std::streampos pointer); std::streampos getPointer(); void seekTo(float percent); bool getNextLine(std::string& line); bool getNextLineAt(std::string& line, float percent); float getPercent(); bool isFinished(); }; extern long long gSeekLogMaxBufferSize; #endif gource-0.54/src/core/sdlapp.h0000644002342600234260000001050114362112041015730 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SDLAPP_H #define SDLAPP_H #include "SDL.h" #ifdef _WIN32 #ifdef _WIN32_WINNT #undef _WIN32_WINNT #endif #define _WIN32_WINNT 0x0501 #include "windows.h" #endif #include "gl.h" #include #include #include extern std::string gSDLAppConfDir; extern std::string gSDLAppResourceDir; extern std::string gSDLAppPathSeparator; extern std::string gSDLAppTitle; extern std::string gSDLAppExec; void SDLAppInfo(std::string msg); void SDLAppQuit(std::string error); void SDLAppInit(std::string apptitle, std::string execname, std::string exepath = ""); std::string SDLAppAddSlash(std::string path); void SDLAppParseArgs(int argc, char *argv[], int* xres, int* yres, bool* fullscreen, std::vector* otherargs = 0); class SDLAppException : public std::exception { protected: std::string message; bool showhelp; public: SDLAppException(const char* str, ...) : showhelp(false) { va_list vl; char msg[65536]; va_start(vl, str); vsnprintf(msg, 65536, str, vl); va_end(vl); message = std::string(msg); } SDLAppException(std::string message) : showhelp(false), message(message) {} ~SDLAppException() throw () {}; bool showHelp() const { return showhelp; } void setShowHelp(bool showhelp) { this->showhelp = showhelp; }; virtual const char* what() const throw() { return message.c_str(); } }; class SDLApp { int frame_count; int fps_updater; int return_code; void updateFramerate(); protected: int min_delta_msec; bool appFinished; void stop(int return_code); virtual bool handleEvent(SDL_Event& event); public: float fps; SDLApp(); virtual ~SDLApp() {}; #ifdef USE_X11 static void initX11ClipboardEventFilter(); static int X11ClipboardEventFilter(const SDL_Event *event); #endif #ifdef _WIN32 static HWND console_window; static bool existing_console; static void initConsole(); static void showConsole(bool show); static void resizeConsole(int height); #endif int run(); static bool getClipboardText(std::string& text); static void setClipboardText(const std::string& text); virtual void resize(int width, int height) {}; virtual void update(float t, float dt) {}; virtual void init() {}; virtual void logic(float t, float dt) {}; virtual void draw(float t, float dt) {}; virtual void quit() { appFinished = true; }; virtual void mouseMove(SDL_MouseMotionEvent *e) {}; virtual void mouseClick(SDL_MouseButtonEvent *e) {}; virtual void keyPress(SDL_KeyboardEvent *e) {}; #if SDL_VERSION_ATLEAST(2,0,0) virtual void textInput(SDL_TextInputEvent* e) {}; virtual void textEdit(SDL_TextEditingEvent* e) {}; virtual void mouseWheel(SDL_MouseWheelEvent *e) {}; #endif int returnCode(); bool isFinished(); }; #endif gource-0.54/src/core/shader.h0000644002342600234260000000531614362112041015723 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef GLSL_SHADER_H #define GLSL_SHADER_H #include "vectors.h" #include "resource.h" #include #include #include #include #include #include #include "shader_common.h" class Shader; class ShaderPass : public AbstractShaderPass { public: ShaderPass(Shader* parent, int shader_object_type, const std::string& shader_object_desc); ~ShaderPass(); void attachTo(unsigned int program); void unload(); void compile(); void checkError(); }; class Shader : public AbstractShader { protected: void checkProgramError(); public: Shader(); Shader(const std::string& prefix); ~Shader(); void applyUniform(ShaderUniform* u); int getUniformLocation(const std::string& uniform_name); void loadPrefix(); void compile(); void link(); void load(); void unload(); void bind(); void unbind(); AbstractShaderPass* grabShaderPass(unsigned int shader_object_type); }; class ShaderManager : public ResourceManager { public: ShaderManager(); Shader* grab(const std::string& shader_prefix); void manage(Shader* shader); void unload(); void reload(bool force = false); }; extern ShaderManager shadermanager; #endif gource-0.54/src/core/frustum.cpp0000644002342600234260000001250314362112041016511 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "frustum.h" // Lighthouse 3D Frustum tutorial: // http://www.lighthouse3d.com/opengl/viewfrustum/index.php?gasource Frustum::Frustum() { } Frustum::Frustum(const vec3& source, const vec3& target, const vec3& up, float fov, float near_distance, float far_distance) { update(source, target, up, fov, near_distance, far_distance); } void Frustum::update(const vec3& source, const vec3& target, const vec3& up, float fov, float near_distance, float far_distance) { updatePerspective(fov, near_distance, far_distance); updateView(source, target, up); } void Frustum::updatePerspective(float fov, float near_distance, float far_distance) { this->near_distance = near_distance; this->far_distance = far_distance; view_ratio = (float) display.width / (float) display.height; float toa = (float) tan(fov * 0.5 * DEGREES_TO_RADIANS); near_half_height = near_distance * toa; near_half_width = near_half_height * view_ratio; far_half_height = far_distance * toa; far_half_width = far_half_height * view_ratio; } void Frustum::updateView(const vec3& source, const vec3& target, const vec3& up) { vec3 view_ray = normalise(target - source); vec3 horiz_normal = normalise(glm::cross(view_ray,up)); vec3 vert_normal = glm::cross(horiz_normal, view_ray); //calculate the positions of the 8 points that make up //the viewing frustum and then use them to create the 6 planes vec3 near_centre = source + view_ray * near_distance; vec3 far_centre = source + view_ray * far_distance; vec3 near_horiz_offset = horiz_normal * near_half_width; vec3 near_vert_offset = vert_normal * near_half_height; near_top_left = near_centre + near_vert_offset - near_horiz_offset; near_top_right = near_centre + near_vert_offset + near_horiz_offset; near_bottom_left = near_centre - near_vert_offset - near_horiz_offset; near_bottom_right = near_centre - near_vert_offset + near_horiz_offset; vec3 far_horiz_offset = horiz_normal * far_half_width; vec3 far_vert_offset = vert_normal * far_half_height; far_top_left = far_centre + far_vert_offset - far_horiz_offset; far_top_right = far_centre + far_vert_offset + far_horiz_offset; far_bottom_left = far_centre - far_vert_offset - far_horiz_offset; far_bottom_right = far_centre - far_vert_offset + far_horiz_offset; //top planes[0] = Plane(near_top_right, near_top_left, far_top_left); //bottom planes[1] = Plane(near_bottom_left, near_bottom_right, far_bottom_right); //left planes[2] = Plane(near_top_left, near_bottom_left, far_bottom_left); //right planes[3] = Plane(near_bottom_right, near_top_right, far_bottom_right); //near planes[4] = Plane(near_top_left, near_top_right, near_bottom_right); //far planes[5] = Plane(far_top_right, far_top_left, far_bottom_left); } bool Frustum::contains(const vec3& p) const { for(int i=0; i < 6; i++) { float dist = planes[i].distance(p); if(dist < 0) return false; } return true; } bool Frustum::intersects(const Bounds3D& bounds) const { vec3 corner; for(int i=0; i<6; i++) { corner.x = planes[i].normal.x > 0.0 ? bounds.max.x : bounds.min.x; corner.y = planes[i].normal.y > 0.0 ? bounds.max.y : bounds.min.y; corner.z = planes[i].normal.z > 0.0 ? bounds.max.z : bounds.min.z; if (planes[i].distance(corner) < 0.0) return false; } return true; } bool Frustum::intersects(const Bounds2D& bounds, float z) const { vec3 corner; for(int i=0; i<6; i++) { corner.x = planes[i].normal.x > 0.0 ? bounds.max.x : bounds.min.x; corner.y = planes[i].normal.y > 0.0 ? bounds.max.y : bounds.min.y; corner.z = z; if (planes[i].distance(corner) < 0.0) return false; } return true; } gource-0.54/src/core/gl.h0000644002342600234260000000051214362112041015050 0ustar andrewcandrewc#ifndef CORE_GL_H #define CORE_GL_H #include #define PRINT_GL_ERRORS #ifdef PRINT_GL_ERRORS #define glCheckError() { \ int gl_error = glGetError(); \ if(gl_error != GL_NO_ERROR) warnLog("GL error %s at %s:%d", gluErrorString(gl_error), __FILE__, __LINE__); \ } #else #define glCheckError() #endif #endif gource-0.54/src/core/shader_common.cpp0000644002342600234260000011642614362112041017633 0ustar andrewcandrewc#include "shader_common.h" #include "logger.h" #include #include #include #include std::string gSDLAppShaderDir; Regex Shader_pre_version("^\\s*#version\\s*(\\d+)\\s*"); Regex Shader_pre_extension("^\\s*#extension\\s*([a-zA-Z0-9_]+)\\s+:\\s+(enable|require|warn|disable)\\s*$"); Regex Shader_pre_include("^\\s*#include\\s*\"([^\"]+)\""); Regex Shader_uniform_def("^\\s*uniform\\s+(\\w+)\\s+(\\w+)(?:\\[(\\d+)\\])?\\s*;\\s*(?://\\s*(.+))?$"); Regex Shader_error_line("\\b\\d*\\((\\d+)\\) : error "); Regex Shader_error2_line("\\bERROR: \\d+:(\\d+):"); Regex Shader_error3_line("^\\d+:(\\d+)\\(\\d+\\): error"); Regex Shader_warning_line("\\b\\d*\\((\\d+)\\) : warning "); Regex Shader_redefine_line(" (?:defined|declaration) at \\d*\\((\\d+)\\)"); //ShaderException ShaderException::ShaderException(const std::string& message) : message(message) { } ShaderException::ShaderException(const std::string& message, const std::string& source) : message(message), source(source) { } const std::string& ShaderException::getSource() const { return source; } //ShaderPart ShaderPart::ShaderPart() { } void ShaderPart::setSourceFile(const std::string& filename) { this->filename = filename; loadSourceFile(); } void ShaderPart::loadSourceFile() { processed_source.clear(); raw_source.clear(); // get length std::ifstream in(filename.c_str()); if(!in.is_open()) { throw ShaderException(str(boost::format("could not open '%s'") % filename)); } std::string line; while( std::getline(in,line) ) { raw_source += line; raw_source += "\n"; } in.close(); } void ShaderPart::reload() { loadSourceFile(); } void ShaderPart::reset() { processed_source.clear(); defines.clear(); substitutions.clear(); } void ShaderPart::setSource(const std::string& source) { raw_source = source; } void ShaderPart::applySubstitution(std::string& source, const std::string& name, const std::string& value) { std::string::size_type next_match; for(next_match = source.find(name); next_match != std::string::npos; next_match = source.find(name, next_match)) { source.replace(next_match, name.length(), value); next_match += value.length(); } } void ShaderPart::substitute(const std::string& name, const char *value, ...) { va_list vl; char sub[65536]; char* buffer = sub; va_start(vl, value); int string_size = vsnprintf(sub, sizeof(sub), value, vl); if(string_size > sizeof(sub)) { buffer = new char[string_size]; string_size = vsnprintf(buffer, string_size, value, vl); } va_end(vl); substitutions[name] = buffer; } void ShaderPart::substitute(const std::string& name, const std::string& value) { substitute(name, value.c_str()); } void ShaderPart::applySubstitutions(std::string& source) { for(std::map::iterator it = substitutions.begin(); it != substitutions.end(); it++) { applySubstitution(source, it->first, it->second); } } void ShaderPart::applyDefines(std::string& source) { for(std::map::iterator it = defines.begin(); it != defines.end(); it++) { source.append(str(boost::format("#define %s %s\n") % it->first % it->second)); } } void ShaderPart::define(const std::string& name, const std::string& value) { define(name, value.c_str()); } void ShaderPart::define(const std::string& name, const char *value, ...) { va_list vl; char sub[65536]; char* buffer = sub; va_start(vl, value); int string_size = vsnprintf(sub, sizeof(sub), value, vl); if(string_size > sizeof(sub)) { buffer = new char[string_size]; string_size = vsnprintf(buffer, string_size, value, vl); } va_end(vl); defines[name] = buffer; if(buffer != sub) delete[] buffer; } void ShaderPart::define(const std::string& name) { define(name, ""); } void ShaderPart::preprocess() { processed_source.clear(); // add defines at the top of the source applyDefines(processed_source); // do trivial substitutions std::vector matches; std::stringstream in(raw_source); std::string line; while( std::getline(in,line) ) { applySubstitutions(line); processed_source.append(line); processed_source.append("\n"); } } const std::string& ShaderPart::getSource() { if(processed_source.empty()) preprocess(); return processed_source; } //ShaderUniform ShaderUniform::ShaderUniform(AbstractShader* shader, const std::string& name, int uniform_type, const std::string& type_name) : shader(shader), name(name), location(-1), initialized(false), modified(false), baked(false), uniform_type(uniform_type), type_name(type_name) { } void ShaderUniform::unload() { location = -1; } int ShaderUniform::getLocation() { if(location != -1) return location; location = shader->getUniformLocation( name.c_str() ); return location; } const std::string& ShaderUniform::getName() const { return name; } void ShaderUniform::setBaked(bool baked) { if(this->baked == baked) return; this->baked = baked; modified = true; } void ShaderUniform::setComment(const std::string& comment) { this->comment = comment; } const std::string& ShaderUniform::getComment() const { return comment; } //FloatShaderUniform FloatShaderUniform::FloatShaderUniform(AbstractShader* shader, const std::string& name, float value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_FLOAT, "float") { } void FloatShaderUniform::setValue(float value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } float& FloatShaderUniform::getValue() { return value; } void FloatShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("#define %s %e\n") % name % value)); } else { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } } //IntShaderUniform IntShaderUniform::IntShaderUniform(AbstractShader* shader, const std::string& name, int value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_INT, "int") { } void IntShaderUniform::setValue(int value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } int& IntShaderUniform::getValue() { return value; } void IntShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("#define %s %d\n") % name % value)); } else { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } } //BoolShaderUniform BoolShaderUniform::BoolShaderUniform(AbstractShader* shader, const std::string& name, bool value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_BOOL, "bool") { } void BoolShaderUniform::setValue(bool value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } bool& BoolShaderUniform::getValue() { return value; } void BoolShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("#define %s %s\n") % name % (value ? "true" : "false"))); } else { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } } //Sampler1DShaderUniform Sampler1DShaderUniform::Sampler1DShaderUniform(AbstractShader* shader, const std::string& name, int value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_SAMPLER_1D, "sampler1D") { } void Sampler1DShaderUniform::setValue(int value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } void Sampler1DShaderUniform::setBaked(bool baked) { } void Sampler1DShaderUniform::write(std::string& content) const { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } int& Sampler1DShaderUniform::getValue() { return value; } //Sampler2DShaderUniform Sampler2DShaderUniform::Sampler2DShaderUniform(AbstractShader* shader, const std::string& name, int value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_SAMPLER_2D, "sampler2D") { } void Sampler2DShaderUniform::setValue(int value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } int& Sampler2DShaderUniform::getValue() { return value; } //cant be baked void Sampler2DShaderUniform::setBaked(bool baked) { } void Sampler2DShaderUniform::write(std::string& content) const { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } //Sampler3DShaderUniform Sampler3DShaderUniform::Sampler3DShaderUniform(AbstractShader* shader, const std::string& name, int value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_SAMPLER_3D, "sampler3D") { } void Sampler3DShaderUniform::setValue(int value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } int& Sampler3DShaderUniform::getValue() { return value; } //cant be baked? void Sampler3DShaderUniform::setBaked(bool baked) { } void Sampler3DShaderUniform::write(std::string& content) const { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } //Vec2ShaderUniform Vec2ShaderUniform::Vec2ShaderUniform(AbstractShader* shader, const std::string& name, const vec2& value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_VEC2, "vec2") { } void Vec2ShaderUniform::setValue(const vec2& value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } vec2& Vec2ShaderUniform::getValue() { return value; } void Vec2ShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("#define %s vec2(%e, %e)\n") % name % value.x % value.y)); } else { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } } //Vec3ShaderUniform Vec3ShaderUniform::Vec3ShaderUniform(AbstractShader* shader, const std::string& name, const vec3& value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_VEC3, "vec3") { } void Vec3ShaderUniform::setValue(const vec3& value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } vec3& Vec3ShaderUniform::getValue() { return value; } void Vec3ShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("#define %s vec3(%e, %e, %e)\n") % name % value.x % value.y % value.z)); } else { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } } //Vec4ShaderUniform Vec4ShaderUniform::Vec4ShaderUniform(AbstractShader* shader, const std::string& name, const vec4& value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_VEC4, "vec4") { } void Vec4ShaderUniform::setValue(const vec4& value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } vec4& Vec4ShaderUniform::getValue() { return value; } void Vec4ShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("#define %s vec4(%e, %e, %e, %e)\n") % name % value.x % value.y % value.z % value.w)); } else { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } } //Mat3ShaderUniform Mat3ShaderUniform::Mat3ShaderUniform(AbstractShader* shader, const std::string& name, const mat3& value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_MAT3, "mat3") { } void Mat3ShaderUniform::setValue(const mat3& value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } mat3& Mat3ShaderUniform::getValue() { return value; } void Mat3ShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("#define %s mat3(%e, %e, %e, %e, %e, %e, %e, %e, %e)\n") % name % value[0][0] % value[0][1] % value[0][2] % value[1][0] % value[1][1] % value[1][2] % value[2][0] % value[2][1] % value[2][2])); } else { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } } //Mat4ShaderUniform Mat4ShaderUniform::Mat4ShaderUniform(AbstractShader* shader, const std::string& name, const mat4& value) : value(value), ShaderUniform(shader, name, SHADER_UNIFORM_MAT4, "mat4") { } void Mat4ShaderUniform::setValue(const mat4& value) { if(baked && this->value == value) return; this->value = value; modified = true; initialized = true; } mat4& Mat4ShaderUniform::getValue() { return value; } void Mat4ShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("#define %s mat4(%e, %e, %e, %e, %e, %e, %e, %e, %e, %e, %e, %e, %e, %e, %e, %e)\n") % name % value[0][0] % value[0][1] % value[0][2] % value[0][3] % value[1][0] % value[1][1] % value[1][2] % value[1][3] % value[2][0] % value[2][1] % value[2][2] % value[2][3] % value[3][0] % value[3][1] % value[3][2] % value[3][3])); } else { content.append(str(boost::format("uniform %s %s;\n") % type_name % name)); } } //IntegerArrayShaderUniform IntegerArrayShaderUniform::IntegerArrayShaderUniform(AbstractShader* shader, const std::string& name, size_t length) : length(length), ShaderUniform(shader, name, SHADER_UNIFORM_INT_ARRAY, "int") { } IntegerArrayShaderUniform::~IntegerArrayShaderUniform() { } const std::vector& IntegerArrayShaderUniform::getValue() { return value; } size_t IntegerArrayShaderUniform::getLength() const { return value.size(); } void IntegerArrayShaderUniform::copyValue(const std::vector& value) { this->value = value; } void IntegerArrayShaderUniform::setValue(const std::vector& value) { if(baked) { bool match = true; for(size_t i=0;ivalue[i]) { match = false; break; } } if(match) return; } copyValue(value); modified = true; initialized = true; } void IntegerArrayShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("%s[%d] %s = %s[] (\n") % type_name % length % name % type_name)); for(size_t i=0; i& FloatArrayShaderUniform::getValue() { return value; } size_t FloatArrayShaderUniform::getLength() const { return length; } void FloatArrayShaderUniform::copyValue(const std::vector& value) { this->value = value; } void FloatArrayShaderUniform::setValue(const std::vector& value) { if(baked) { bool match = true; for(size_t i=0;ivalue[i]) { match = false; break; } } if(match) return; } copyValue(value); modified = true; initialized = true; } void FloatArrayShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("%s[%d] %s = %s[] (\n") % type_name % length % name % type_name)); for(size_t i=0; ivalue.resize(length); if(value != 0) copyValue(value); } Vec2ArrayShaderUniform::~Vec2ArrayShaderUniform() { } const std::vector& Vec2ArrayShaderUniform::getValue() { return value; } size_t Vec2ArrayShaderUniform::getLength() const { return length; } void Vec2ArrayShaderUniform::copyValue(const vec2* value) { for(size_t i=0; ivalue[i] = value[i]; } } void Vec2ArrayShaderUniform::copyValue(const std::vector& value) { for(size_t i=0; ivalue[i] = value[i]; } } void Vec2ArrayShaderUniform::setValue(const vec2* value) { if(baked) { bool match = true; for(size_t i=0;ivalue[i]) { match = false; break; } } if(match) return; } copyValue(value); modified = true; initialized = true; } void Vec2ArrayShaderUniform::setValue(const std::vector& value) { if(baked) { bool match = true; for(size_t i=0;ivalue[i]) { match = false; break; } } if(match) return; } copyValue(value); modified = true; initialized = true; } void Vec2ArrayShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("%s[%d] %s = %s[] (\n") % type_name % length % name % type_name)); for(size_t i=0; ivalue.resize(length); if(value != 0) copyValue(value); } Vec3ArrayShaderUniform::~Vec3ArrayShaderUniform() { } const std::vector& Vec3ArrayShaderUniform::getValue() { return value; } size_t Vec3ArrayShaderUniform::getLength() const { return length; } void Vec3ArrayShaderUniform::copyValue(const vec3* value) { for(size_t i=0; ivalue[i] = value[i]; } } void Vec3ArrayShaderUniform::copyValue(const std::vector& value) { for(size_t i=0; ivalue[i] = value[i]; } } void Vec3ArrayShaderUniform::setValue(const vec3* value) { if(baked) { bool match = true; for(size_t i=0;ivalue[i]) { match = false; break; } } if(match) return; } copyValue(value); modified = true; initialized = true; } void Vec3ArrayShaderUniform::setValue(const std::vector& value) { if(baked) { bool match = true; for(size_t i=0;ivalue[i]) { match = false; break; } } if(match) return; } copyValue(value); modified = true; initialized = true; } void Vec3ArrayShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("%s[%d] %s = %s[] (\n") % type_name % length % name % type_name)); for(size_t i=0; ivalue.resize(length); if(value != 0) copyValue(value); } Vec4ArrayShaderUniform::~Vec4ArrayShaderUniform() { } const std::vector& Vec4ArrayShaderUniform::getValue() { return value; } size_t Vec4ArrayShaderUniform::getLength() const { return length; } void Vec4ArrayShaderUniform::copyValue(const std::vector& value) { for(size_t i=0; ivalue[i] = value[i]; } } void Vec4ArrayShaderUniform::copyValue(const vec4* value) { for(size_t i=0; ivalue[i] = value[i]; } } void Vec4ArrayShaderUniform::setValue(const vec4* value) { if(baked) { bool match = true; for(size_t i=0;ivalue[i]) { match = false; break; } } if(match) return; } copyValue(value); modified = true; initialized = true; } void Vec4ArrayShaderUniform::setValue(const std::vector& value) { if(baked) { bool match = true; for(size_t i=0;ivalue[i]) { match = false; break; } } if(match) return; } copyValue(value); modified = true; initialized = true; } void Vec4ArrayShaderUniform::write(std::string& content) const { if(baked) { content.append(str(boost::format("%s[%d] %s = %s[] (\n") % type_name % length % name % type_name)); for(size_t i=0; i=line_no) || (i>line_no && i-amount<=line_no)) { context.append(str(boost::format("%s%4d | %s\n") % (i==line_no ? "-> ": " ") % i % line)); } i++; } } bool AbstractShaderPass::errorContext(const std::string& log_message, std::string& context) { std::vector matches; if( !Shader_error_line.match(log_message, &matches) && !Shader_error2_line.match(log_message, &matches) && !Shader_error3_line.match(log_message, &matches) && !(Logger::getDefault()->getLevel() == LOG_LEVEL_WARN && Shader_warning_line.match(log_message, &matches))) return false; int line_no = atoi(matches[0].c_str()); if(Shader_redefine_line.match(log_message, &matches)) { int redefine_line_no = atoi(matches[0].c_str()); showContext(context, redefine_line_no, 3); context += "\n"; } showContext(context, line_no, 3); return true; } void AbstractShaderPass::toString(std::string& out) { if(version!=0) { out.append(str(boost::format("#version %d\n") % version)); } for(std::map::iterator it = extensions.begin(); it != extensions.end(); it++) { out.append(str(boost::format("#extension %s : %s\n") % it->first % it->second)); } for(ShaderUniform* u : uniforms) { u->write(out); } out.append(source); } const std::string& AbstractShaderPass::getObjectSource() { return shader_object_source; } bool AbstractShaderPass::isEmpty() { return source.empty(); } std::list& AbstractShaderPass::getUniforms() { return uniforms; } //add uniform, unless parent Shader has this in which case link to it ShaderUniform* AbstractShaderPass::addArrayUniform(const std::string& name, const std::string& type, size_t length) { ShaderUniform* uniform = 0; if((uniform = parent->getUniform(name)) == 0) { if(type == "int") { uniform = new IntegerArrayShaderUniform(parent, name, length); } else if(type == "float") { uniform = new FloatArrayShaderUniform(parent, name, length); } else if(type == "vec2") { uniform = new Vec2ArrayShaderUniform(parent, name, length); } else if(type == "vec3") { uniform = new Vec3ArrayShaderUniform(parent, name, length); } else if(type == "vec4") { uniform = new Vec4ArrayShaderUniform(parent, name, length); } else { throw ShaderException(str(boost::format("shader uniform arrays for type '%s' not implemented") % type)); } uniform->setInitialized(false); parent->addUniform(uniform); } uniforms.push_back(uniform); return uniform; } ShaderUniform* AbstractShaderPass::addUniform(const std::string& name, const std::string& type) { ShaderUniform* uniform = 0; if((uniform = parent->getUniform(name)) == 0) { if(type == "float") { uniform = new FloatShaderUniform(parent, name); } else if(type == "int") { uniform = new IntShaderUniform(parent, name); } else if(type == "bool") { uniform = new BoolShaderUniform(parent, name); } else if(type == "sampler1D") { uniform = new Sampler1DShaderUniform(parent, name); } else if(type == "sampler2D") { uniform = new Sampler2DShaderUniform(parent, name); } else if(type == "sampler3D") { uniform = new Sampler3DShaderUniform(parent, name); } else if(type == "vec2") { uniform = new Vec2ShaderUniform(parent, name); } else if(type == "vec3") { uniform = new Vec3ShaderUniform(parent, name); } else if(type == "vec4") { uniform = new Vec4ShaderUniform(parent, name); } else if(type == "mat3") { uniform = new Mat3ShaderUniform(parent, name); } else if(type == "mat4") { uniform = new Mat4ShaderUniform(parent, name); } else { throw ShaderException(str(boost::format("unsupported shader uniform type '%s'") % type)); } uniform->setInitialized(false); parent->addUniform(uniform); } uniforms.push_back(uniform); return uniform; } bool AbstractShaderPass::preprocess(const std::string& line) { std::vector matches; if(Shader_pre_version.match(line, &matches)) { version = atoi(matches[0].c_str()); return true; } if(Shader_pre_extension.match(line, &matches)) { extensions[matches[0]] = matches[1]; return true; } if(Shader_pre_include.match(line, &matches)) { std::string include_file = gSDLAppShaderDir + matches[0]; includeFile(include_file); return true; } if(Shader_uniform_def.match(line, &matches)) { std::string uniform_type = matches[0]; std::string uniform_name = matches[1]; ShaderUniform* uniform = 0; if(matches.size() > 2 && !matches[2].empty()) { size_t uniform_length = atoi(matches[2].c_str()); uniform = addArrayUniform(uniform_name, uniform_type, uniform_length); } else { uniform = addUniform(uniform_name, uniform_type); } if(matches.size() > 3 && !matches[3].empty()) uniform->setComment(matches[3]); return true; } return false; } void AbstractShaderPass::includeFile(const std::string& filename) { // get length std::ifstream in(filename.c_str()); if(!in.is_open()) { throw ShaderException(str(boost::format("could not open '%s'") % filename)); } std::string line; while( std::getline(in,line) ) { if(!preprocess(line)) { source += line; source += "\n"; } } in.close(); } void AbstractShaderPass::includeSource(const std::string& string) { std::stringstream in(string); std::string line; while( std::getline(in,line) ) { if(!preprocess(line)) { source += line; source += "\n"; } } } // AbstractShader AbstractShader::AbstractShader(const std::string& prefix) : prefix(prefix), Resource(prefix) { setDefaults(); } AbstractShader::AbstractShader() { setDefaults(); } void AbstractShader::setDynamicCompile(bool dynamic_compile) { this->dynamic_compile = dynamic_compile; } void AbstractShader::setDefaults() { vertex_shader = 0; fragment_shader = 0; geometry_shader = 0; compute_shader = 0; program = 0; dynamic_compile = false; } void AbstractShader::clear() { unload(); for(std::map::iterator it= uniforms.begin(); it!=uniforms.end();it++) { delete it->second; } uniforms.clear(); uniform_list.clear(); if(vertex_shader != 0) delete vertex_shader; if(geometry_shader != 0) delete geometry_shader; if(fragment_shader != 0) delete fragment_shader; if(compute_shader != 0) delete compute_shader; vertex_shader = 0; geometry_shader = 0; fragment_shader = 0; compute_shader = 0; } bool AbstractShader::isEmpty() { if( (!vertex_shader || vertex_shader->isEmpty()) && (!fragment_shader || fragment_shader->isEmpty()) && (!geometry_shader || geometry_shader->isEmpty()) && (!compute_shader || compute_shader->isEmpty())) { return true; } return false; } void AbstractShader::reload(bool force) { if(isEmpty()) return; if(force && !prefix.empty()) { loadPrefix(); } else { load(); } } void AbstractShader::use() { if(Logger::getDefault()->getLevel() == LOG_LEVEL_PEDANTIC) { for(std::map::iterator it= uniforms.begin(); it!=uniforms.end();it++) { ShaderUniform* u = it->second; if(!u->isInitialized()) pedanticLog("shader '%s': uniform '%s' was never initialized", (!resource_name.empty() ? resource_name.c_str() : "???"), u->getName().c_str()); } } if(dynamic_compile && needsCompile()) { unbind(); load(); infoLog("shader '%s' recompiled", resource_name.c_str()); } bind(); applyUniforms(); } unsigned int AbstractShader::getProgram() { return program; } void AbstractShader::addUniform(ShaderUniform* uniform) { if(getUniform(uniform->getName()) != 0) { throw ShaderException(str(boost::format("shader already has a uniform named '%s'") % uniform->getName())); } uniforms[uniform->getName()] = uniform; uniform_list.push_back(uniform); } ShaderUniform* AbstractShader::getUniform(const std::string& name) { std::map::iterator it = uniforms.find(name); if(it != uniforms.end()) { return it->second; } return 0; } void AbstractShader::includeSource(unsigned int shader_object_type, const std::string& source) { AbstractShaderPass* pass = grabShaderPass(shader_object_type); pass->includeSource(source); } void AbstractShader::includeFile(unsigned int shader_object_type, const std::string& filename) { AbstractShaderPass* pass = grabShaderPass(shader_object_type); pass->includeFile(filename); } void AbstractShader::addSubstitute(const std::string& name, const std::string& value) { substitutions[name] = value; } void AbstractShader::addSubstitute(const std::string& name, const char *value, ...) { va_list vl; char sub[65536]; char* buffer = sub; va_start(vl, value); int string_size = vsnprintf(sub, sizeof(sub), value, vl); if(string_size > sizeof(sub)) { buffer = new char[string_size]; string_size = vsnprintf(buffer, string_size, value, vl); } va_end(vl); substitutions[name] = buffer; if(buffer != sub) delete[] buffer; } void AbstractShader::substitute(std::string& source, const std::string& name, const std::string& value) { std::string::size_type next_match; for(next_match = source.find(name); next_match != std::string::npos; next_match = source.find(name, next_match)) { source.replace(next_match, name.length(), value); next_match += value.length(); } } void AbstractShader::applySubstitutions(std::string& source) { for(std::map::iterator it = substitutions.begin(); it != substitutions.end(); it++) { substitute(source, it->first, it->second); } } void AbstractShader::setBool (const std::string& name, bool value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_BOOL) return; ((BoolShaderUniform*)uniform)->setValue(value); } void AbstractShader::setInteger (const std::string& name, int value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_INT) return; ((IntShaderUniform*)uniform)->setValue(value); } void AbstractShader::setSampler1D (const std::string& name, int value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_SAMPLER_1D) return; ((Sampler1DShaderUniform*)uniform)->setValue(value); } void AbstractShader::setSampler2D (const std::string& name, int value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_SAMPLER_2D) return; ((Sampler2DShaderUniform*)uniform)->setValue(value); } void AbstractShader::setSampler3D (const std::string& name, int value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_SAMPLER_3D) return; ((Sampler3DShaderUniform*)uniform)->setValue(value); } void AbstractShader::setFloat(const std::string& name, float value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_FLOAT) return; ((FloatShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec2 (const std::string& name, const vec2& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC2) return; ((Vec2ShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec3 (const std::string& name, const vec3& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC3) return; ((Vec3ShaderUniform*)uniform)->setValue(value); } void AbstractShader::setFloatArray(const std::string& name, std::vector& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_FLOAT_ARRAY) return; ((FloatArrayShaderUniform*)uniform)->setValue(value); } void AbstractShader::setIntegerArray (const std::string& name, std::vector& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_INT_ARRAY) return; ((IntegerArrayShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec2Array (const std::string& name, vec2* value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC2_ARRAY) return; ((Vec2ArrayShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec2Array (const std::string& name, std::vector& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC2_ARRAY) return; ((Vec2ArrayShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec3Array (const std::string& name, vec3* value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC3_ARRAY) return; ((Vec3ArrayShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec3Array (const std::string& name, std::vector& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC3_ARRAY) return; ((Vec3ArrayShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec4Array (const std::string& name, vec4* value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC4_ARRAY) return; ((Vec4ArrayShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec4Array (const std::string& name, std::vector& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC4_ARRAY) return; ((Vec4ArrayShaderUniform*)uniform)->setValue(value); } void AbstractShader::setVec4 (const std::string& name, const vec4& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_VEC4) return; ((Vec4ShaderUniform*)uniform)->setValue(value); } void AbstractShader::setMat3 (const std::string& name, const mat3& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_MAT3) return; ((Mat3ShaderUniform*)uniform)->setValue(value); } void AbstractShader::setMat4 (const std::string& name, const mat4& value) { ShaderUniform* uniform = getUniform(name); if(!uniform || uniform->getType() != SHADER_UNIFORM_MAT4) return; ((Mat4ShaderUniform*)uniform)->setValue(value); } void AbstractShader::setBaked(const std::string& name, bool baked) { ShaderUniform* uniform = getUniform(name); if(!uniform) return; uniform->setBaked(baked); } void AbstractShader::setBakedUniforms(bool baked) { for(std::map::iterator it= uniforms.begin(); it!=uniforms.end();it++) { it->second->setBaked(baked); } } const std::list& AbstractShader::getUniforms() { return uniform_list; } void AbstractShader::applyUniforms() { for(std::map::iterator it= uniforms.begin(); it!=uniforms.end();it++) { ShaderUniform* u = it->second; if(!u->isBaked()) applyUniform(u); } } bool AbstractShader::needsCompile() { for(std::map::iterator it= uniforms.begin(); it!=uniforms.end();it++) { ShaderUniform* u = it->second; if(u->isBaked() && u->isModified()) { //infoLog("baked uniform %s needs update", u->getName().c_str()); return true; } } return false; } gource-0.54/src/core/tga.cpp0000644002342600234260000002006614362112041015562 0ustar andrewcandrewc/* Copyright (c) 2012 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "tga.h" #include "display.h" #include TGAWriter::TGAWriter(int components) : components(components) { rle = true; out = 0; rle_count = 0; raw_count = 0; } void TGAWriter::writeRLE(int pixel_count, const char* pixel) { rle_count += pixel_count; while(pixel_count > 0) { int write_count = std::min(128, pixel_count); unsigned char counter_byte = (write_count-1) | 0x80; out->write((char*)&counter_byte, 1); out->write(pixel, components); pixel_count -= write_count; } } void TGAWriter::writeRaw(std::vector& buffer, int start, int pixel_count) { raw_count += pixel_count; int written = 0; while(pixel_count > 0) { int write_count = std::min(128, pixel_count); char counter_byte = write_count-1; out->write((char*)&counter_byte, 1); for(int i=0; i < write_count; i++) { out->write(&(buffer[start+(i+written)*components]), components); } pixel_count -= write_count; written += write_count; } } bool TGAWriter::open(const std::string& filename) { out = new std::ofstream(filename.c_str(), std::ios::out | std::ios::binary); if(out->fail()) { delete out; out = 0; return false; } return true; } void TGAWriter::close() { ((std::fstream*)out)->close(); } void TGAWriter::setOutputStream(std::ostream* out) { this->out = out; } void TGAWriter::screenshot(const std::string& filename) { if(!open(filename)) return; std::vector buffer; buffer.resize(display.width * display.height * components); capture(buffer); writeTGA(buffer); close(); } void TGAWriter::writeHeader() { char image_type = rle ? 10 : 2; const char tga_header[12] = { 0, 0, image_type, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; short width = display.width; short height = display.height; char imagedescriptor = components==4 ? 8 : 0; char bpp = components * 8; out->write(tga_header, 12); out->write((char*)&width, sizeof(short)); out->write((char*)&height, sizeof(short)); out->write(&bpp, 1); out->write(&imagedescriptor, 1); } void TGAWriter::capture(std::vector& buffer) { GLenum pixel_format = components == 4 ? GL_BGRA : GL_BGR; glReadPixels(0, 0, display.width, display.height, pixel_format, GL_UNSIGNED_BYTE, &(buffer[0])); } void TGAWriter::writeTGA(std::vector& buffer) { writeHeader(); writeScanlines(buffer, display.width, display.height); } void TGAWriter::writeScanlines(std::vector& buffer, int width, int height) { if(!rle) { out->write(&(buffer[0]), buffer.size()); } else { for(int y=0; y 0) { int skipped = (x-(match_count)) - (last_written+1); if(skipped > 0) { writeRaw(buffer, (last_written + 1 + y*width)*components, skipped); last_written = x-1; } } } else if(match_count > 0) { writeRLE(match_count+1, last_pixel); last_written = x-1; match_count = 0; } last_pixel = pixel; } if(match_count > 0) { writeRLE(match_count+1, last_pixel); } else { int skipped = width - (last_written+1); if(skipped > 0) { writeRaw(buffer, (last_written + 1 + y*width)*components, skipped); } } } } } // TGAExporter TGAExporter::TGAExporter(const std::string& filename) { buffer1.resize(display.width * display.height * 3); buffer2.resize(display.width * display.height * 3); buffer_shared_ptr = 0; thread_state = TGA_EXPORTER_WAIT; cond = SDL_CreateCond(); mutex = SDL_CreateMutex(); if(filename == "-") { writer.setOutputStream(&std::cout); } else { this->filename = filename; if(!writer.open(filename)) { throw TGAExporterException(filename); } } #if SDL_VERSION_ATLEAST(2,0,0) thread = SDL_CreateThread( TGAExporter::startThread, "tga_exporter", this ); #else thread = SDL_CreateThread( TGAExporter::startThread, this ); #endif } TGAExporter::~TGAExporter() { stop(); SDL_DestroyCond(cond); SDL_DestroyMutex(mutex); buffer_shared_ptr = 0; if(!filename.empty()) { writer.close(); } } int TGAExporter::startThread(void *exporter) { (static_cast(exporter))->run(); return 0; } void TGAExporter::run() { SDL_mutexP(mutex); while(thread_state != TGA_EXPORTER_EXIT) { thread_state = TGA_EXPORTER_WAIT; while (thread_state == TGA_EXPORTER_WAIT) { SDL_CondWait(cond, mutex); } if (thread_state != TGA_EXPORTER_WRITE) break; if (buffer_shared_ptr != 0) { writer.writeTGA(*buffer_shared_ptr); } } thread_state = TGA_EXPORTER_STOPPED; SDL_mutexV(mutex); } void TGAExporter::stop() { if(!thread) return; if(thread_state == TGA_EXPORTER_STOPPED || thread_state == TGA_EXPORTER_EXIT) return; SDL_mutexP(mutex); thread_state = TGA_EXPORTER_EXIT; SDL_CondSignal(cond); SDL_mutexV(mutex); SDL_WaitThread(thread, 0); thread = 0; } void TGAExporter::capture() { std::vector* next_pixel_ptr = (buffer_shared_ptr == &buffer1) ? &buffer2 : &buffer1; writer.capture(*next_pixel_ptr); SDL_mutexP(mutex); buffer_shared_ptr = next_pixel_ptr; thread_state = TGA_EXPORTER_WRITE; SDL_CondSignal(cond); SDL_mutexV(mutex); } gource-0.54/src/core/plane.cpp0000644002342600234260000000353014362112041016103 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "plane.h" Plane::Plane() { d = 0.0f; } Plane::Plane(const vec3 & v1, const vec3 & v2, const vec3 & v3) { vec3 edge1 = v1 - v2; vec3 edge2 = v3 - v2; normal = glm::normalize(glm::cross(edge2, edge1)); point = v2; d = -(glm::dot(normal, point)); } float Plane::distance(const vec3 & p) const { return d + glm::dot(normal, p); } gource-0.54/src/core/settings.cpp0000644002342600234260000003204614362112041016650 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "sdlapp.h" #include "settings.h" #include "regex.h" #include "timezone.h" #include "logger.h" Regex SDLAppSettings_rect_regex("^([0-9.]+)x([0-9.]+)$"); Regex SDLAppSettings_viewport_regex("^([0-9.]+)x([0-9.]+)(!)?$"); SDLAppSettings::SDLAppSettings() { setDisplayDefaults(); default_section_name = "settings"; //conf entries in other sections conf_sections["viewport"] = "display"; conf_sections["windowed"] = "display"; conf_sections["fullscreen"] = "display"; conf_sections["frameless"] = "display"; conf_sections["screen"] = "display"; conf_sections["window-position"] = "display"; conf_sections["multi-sampling"] = "display"; conf_sections["output-ppm-stream"] = "display"; conf_sections["output-framerate"] = "display"; conf_sections["transparent"] = "display"; conf_sections["no-vsync"] = "display"; conf_sections["high-dpi"] = "display"; //translate args arg_aliases["f"] = "fullscreen"; arg_aliases["w"] = "windowed"; arg_aliases["o"] = "output-ppm-stream"; arg_aliases["r"] = "output-framerate"; //boolean args arg_types["viewport"] = "string"; arg_types["windowed"] = "bool"; arg_types["screen"] = "int"; arg_types["window-position"] = "string"; arg_types["fullscreen"] = "bool"; arg_types["frameless"] = "bool"; arg_types["transparent"] = "bool"; arg_types["multi-sampling"] = "bool"; arg_types["no-vsync"] = "bool"; arg_types["high-dpi"] = "bool"; arg_types["output-ppm-stream"] = "string"; arg_types["output-framerate"] = "int"; } void SDLAppSettings::setDisplayDefaults() { display_width = 1024; #ifdef __APPLE__ display_height = 640; #else display_height = 768; #endif viewport_specified = false; fullscreen = false; frameless = false; multisample = false; transparent = false; resizable = true; vsync = true; high_dpi = false; screen = -1; window_x = -1; window_y = -1; output_ppm_filename = ""; output_framerate = 60; } void SDLAppSettings::exportDisplaySettings(ConfFile& conf) { ConfSection* section = new ConfSection("display"); char viewportbuff[256]; snprintf(viewportbuff, 256, "%dx%d%s", display_width, display_height, resizable ? "" : "!" ); std::string viewport = std::string(viewportbuff); section->setEntry(new ConfEntry("viewport", viewport)); if(fullscreen) section->setEntry(new ConfEntry("fullscreen", fullscreen)); else { if(frameless) section->setEntry(new ConfEntry("frameless", frameless)); if(window_x >= 0 && window_y >= 0) { char windowbuff[256]; snprintf(windowbuff, 256, "%dx%d", window_x, window_y); section->setEntry(new ConfEntry("window-position", std::string(windowbuff))); } } if(screen > 0) { section->setEntry(new ConfEntry("screen", screen)); } if(multisample) section->setEntry(new ConfEntry("multi-sampling", multisample)); if(!vsync) { section->setEntry(new ConfEntry("no-vsync", true)); } if(high_dpi) { section->setEntry(new ConfEntry("high-dpi", high_dpi)); } conf.setSection(section); } bool SDLAppSettings::parseRectangle(const std::string& value, int& x, int& y) { std::vector matches; if(SDLAppSettings_rect_regex.match(value, &matches)) { x = atoi(matches[0].c_str()); y = atoi(matches[1].c_str()); return true; } return false; } bool SDLAppSettings::parseViewport(const std::string& value, int& x, int& y, bool& no_resize) { std::vector matches; if(SDLAppSettings_viewport_regex.match(value, &matches)) { x = atoi(matches[0].c_str()); y = atoi(matches[1].c_str()); if(matches.size()>2) no_resize = true; if(x>0 && y>0) return true; } return false; } void SDLAppSettings::parseArgs(int argc, char *argv[], ConfFile& conffile, std::vector* files) { std::vector arguments; for (int i=1; i& arguments, ConfFile& conffile, std::vector* files) { std::map::iterator findit; for(int i=0;i1 && args[0] == '-') { args = args.substr(1, args.size()-1); is_option = true; } if(args.size()==0) continue; if(!is_option) { if(files!=0) { files->push_back(args); } continue; } //translate args with aliases if((findit = arg_aliases.find(args)) != arg_aliases.end()) { args = findit->second; } //NUMBERxNUMBER is a magic alias for viewport if(args.size()>1 && args.rfind("x") != std::string::npos) { std::string displayarg = args; int width = 0; int height = 0; bool no_resize = false; if(parseViewport(displayarg, width, height, no_resize)) { if(width>0 && height>0) { ConfSection* display_settings = conffile.getSection("display"); if(!display_settings) { display_settings = conffile.addSection("display"); } display_settings->setEntry("viewport", displayarg); continue; } } } //get type std::string arg_type; if((findit = arg_types.find(args)) != arg_types.end()) { arg_type = findit->second; } else { std::string unknown_option = std::string("unknown option ") + args; throw ConfFileException(unknown_option, "", 0); } //get value (or set to true for booleans) std::string argvalue; if(arg_type == "bool") argvalue = "true"; else if((i+1)second; } //command line options dont go into the conf file if(section_name == "command-line") { commandLineOption(args, argvalue); continue; } //get section(s) of this type ConfSectionList* sections = conffile.getSections(section_name); if(sections == 0) { conffile.addSection(section_name); sections = conffile.getSections(section_name); } //apply to section for(ConfSectionList::iterator it = sections->begin(); it != sections->end(); it++) { ConfSection* section = *it; if(arg_type == "multi-value") { section->addEntry(args, argvalue); } else { section->setEntry(args, argvalue); } } } } bool SDLAppSettings::parseDateTime(const std::string& datetime, time_t& timestamp) { // Support SQL style timestamps and also ISO 8601 https://www.w3.org/TR/NOTE-datetime // "2010-01-02" // "2010-01-02Z" // "2010-01-02 03:04" // "2010-01-02 03:04:05" // "2010-01-01 03:04:05+12" // "2010-01-01T03:04" // "2010-01-01T03:04:05" // "2010-01-01T03:04:05Z" // "2010-01-01T03:04:05+12" // "2010-01-01T00:04:05+5:30" // Sub-seconds are parsed but discarded // "2010-01-01T03:04:05.6789" Regex timestamp_regex("^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{1,2}):(\\d{2})(?::(\\d{2}(?:\\.\\d+)?))?)?(Z| ?([+-])(\\d{1,2})(?::?(\\d{2}))?)?$"); std::vector results; if(!timestamp_regex.match(datetime, &results) || results.size() < 3) return false; // for(int i=0;i= 5 && results[3] != "") { timeinfo.tm_hour = atoi(results[3].c_str()); timeinfo.tm_min = atoi(results[4].c_str()); if(results.size() >= 6) { timeinfo.tm_sec = atoi(results[5].c_str()); } } // optional: Zulu time aka GMT if(results.size() == 7 && results[6] == "Z") { timestamp = mktime_utc(&timeinfo); } // optional: timezone (optional) else if(results.size() >= 9) { int tz_hour = atoi(results[8].c_str()); int tz_min = 0; if(results.size() >= 10) { tz_min = atoi(results[9].c_str()); } int tz_offset = tz_hour * 3600 + tz_min * 60; if(results[7] == "-") { tz_offset = -tz_offset; } timestamp = mktime_utc(&timeinfo); // debugLog("tz_hour = %d", tz_hour); // debugLog("tz_min = %d", tz_min); // debugLog("tz_offset = %d", tz_offset); timestamp -= tz_offset; } else { timestamp = mktime(&timeinfo); } //debugLog("timestamp = %lld", timestamp); return true; } void SDLAppSettings::importDisplaySettings(ConfFile& conffile) { setDisplayDefaults(); ConfSection* display_settings = conffile.getSection("display"); if(display_settings == 0) return; ConfEntry* entry = 0; viewport_specified = false; if((entry = display_settings->getEntry("viewport")) != 0) { std::string viewport = entry->getString(); int width = 0; int height = 0; bool no_resize = false; if(parseViewport(viewport, width, height, no_resize)) { display_width = width; display_height = height; if(no_resize) resizable = false; viewport_specified = true; } else { conffile.invalidValueException(entry); } } if((entry = display_settings->getEntry("window-position")) != 0) { std::string window_position = entry->getString(); if(!parseRectangle(window_position, window_x, window_y)) { conffile.invalidValueException(entry); } } if((entry = display_settings->getEntry("screen")) != 0) { screen = entry->getInt(); if(screen < 1) { conffile.invalidValueException(entry); } } if(display_settings->getBool("multi-sampling")) { multisample = true; } if(display_settings->getBool("fullscreen")) { fullscreen = true; } if(display_settings->getBool("windowed")) { fullscreen = false; } if(display_settings->getBool("frameless") && !fullscreen) { frameless = true; } // default to use desktop resolution for fullscreen unless specified if(fullscreen && !viewport_specified) { display_width = 0; display_height = 0; } if(display_settings->getBool("transparent")) { transparent = true; } if(display_settings->getBool("no-vsync")) { vsync = false; } if(display_settings->getBool("high-dpi")) { high_dpi = true; } if((entry = display_settings->getEntry("output-ppm-stream")) != 0) { if(!entry->hasValue()) { conffile.entryException(entry, "specify ppm output file or '-' for stdout"); } output_ppm_filename = entry->getString(); } if((entry = display_settings->getEntry("output-framerate")) != 0) { if(!entry->hasValue()) { conffile.entryException(entry, "specify framerate (25,30,60)"); } output_framerate = entry->getInt(); if( output_framerate != 25 && output_framerate != 30 && output_framerate != 60) { conffile.entryException(entry, "supported framerates are 25,30,60"); } } } gource-0.54/src/core/timezone.cpp0000644002342600234260000000154014362112041016635 0ustar andrewcandrewc#include "timezone.h" #include #include std::string local_tz; bool tz_initialized = false; void init_tz() { if(tz_initialized) return; //check if TZ is set, store current value char* current_tz_env = getenv("TZ"); if(current_tz_env != 0) { local_tz = std::string("TZ="); local_tz += std::string(current_tz_env); } tz_initialized = true; } void set_utc_tz() { //change TZ to UTC putenv((char*)"TZ=UTC"); tzset(); } void unset_utc_tz() { if(!local_tz.empty()) { putenv((char*)local_tz.c_str()); } else { #ifndef _WIN32 unsetenv("TZ"); #else putenv((char*)"TZ="); #endif } tzset(); } time_t mktime_utc(struct tm* timeinfo) { init_tz(); set_utc_tz(); time_t time_utc = mktime(timeinfo); unset_utc_tz(); return time_utc; } gource-0.54/src/core/logger.cpp0000644002342600234260000001161514362112041016266 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "logger.h" #include #include #include #include std::map log_levels = boost::assign::map_list_of (LOG_LEVEL_ERROR, " ERROR" ) (LOG_LEVEL_CONSOLE, "CONSOLE" ) (LOG_LEVEL_INFO, " INFO" ) (LOG_LEVEL_SCRIPT, " SCRIPT" ) (LOG_LEVEL_DEBUG, " DEBUG" ) (LOG_LEVEL_WARN, " WARN" ) (LOG_LEVEL_PEDANTIC, " PEDANT" ); #define PARSE_AND_LOG(LOG_LEVEL) \ Logger* logger = Logger::getDefault(); \ \ if(!logger || logger->getLevel() < LOG_LEVEL) return; \ \ char msgbuff[65536]; \ char* buffer = msgbuff; \ \ va_list vl; \ \ va_start(vl, str); \ int string_size = vsnprintf(buffer, sizeof(msgbuff), str, vl) + 1; \ \ if(string_size > sizeof(msgbuff)) { \ buffer = new char[string_size]; \ string_size = vsnprintf(buffer, string_size, str, vl); \ } \ \ va_end(vl); \ \ \ logger->message( LOG_LEVEL, buffer ); \ \ if(buffer != msgbuff) delete[] buffer; // LoggerMessage LoggerMessage::LoggerMessage(int level, const std::string& message) : level(level), message(message) { } // Logger Logger* Logger::getDefault() { return default_logger; } Logger::Logger(int level, FILE* stream, int hist_capacity) { init(level, stream, hist_capacity); } void Logger::init(int level, FILE* stream, int hist_capacity) { this->level = level; this->stream = stream; this->hist_capacity = hist_capacity; this->message_count = 0; this->auto_flush = false; } int Logger::getMessageCount() { return message_count; } void Logger::message(int level, const std::string& message) { if(!level || this->level < level) return; if(stream != 0) { fprintf(stream, "%s: %s\n", log_levels[level].c_str(), message.c_str()); if(auto_flush) fflush(stream); } if(!hist_capacity) return; while(history.size() >= hist_capacity) { history.pop_front(); } history.push_back(LoggerMessage(level, message)); message_count++; } const std::deque& Logger::getHistory() const { return history; } void Logger::setHistoryCapacity(int hist_capacity) { this->hist_capacity = hist_capacity; } void Logger::setAutoFlush(bool auto_flush) { this->auto_flush = auto_flush; } void warnLog(const char *str, ...) { PARSE_AND_LOG(LOG_LEVEL_WARN); } void debugLog(const char *str, ...) { PARSE_AND_LOG(LOG_LEVEL_DEBUG); } void infoLog(const char *str, ...) { PARSE_AND_LOG(LOG_LEVEL_INFO); } void errorLog(const char *str, ...) { PARSE_AND_LOG(LOG_LEVEL_ERROR) } void consoleLog(const char *str, ...) { PARSE_AND_LOG(LOG_LEVEL_CONSOLE); } void scriptLog(const char *str, ...) { PARSE_AND_LOG(LOG_LEVEL_SCRIPT); } void pedanticLog(const char *str, ...) { PARSE_AND_LOG(LOG_LEVEL_PEDANTIC); } Logger* Logger::default_logger = new Logger(LOG_LEVEL_ERROR, stderr, 0); LoggerStringStream WarnLog() { return LoggerStringStream(LOG_LEVEL_WARN); } LoggerStringStream DebugLog() { return LoggerStringStream(LOG_LEVEL_DEBUG); } LoggerStringStream InfoLog() { return LoggerStringStream(LOG_LEVEL_INFO); } LoggerStringStream ErrorLog() { return LoggerStringStream(LOG_LEVEL_ERROR); } LoggerStringStream ConsoleLog() { return LoggerStringStream(LOG_LEVEL_CONSOLE); } LoggerStringStream ScriptLog() { return LoggerStringStream(LOG_LEVEL_SCRIPT); } gource-0.54/src/core/ppm.cpp0000644002342600234260000001061614362112041015603 0ustar andrewcandrewc/* Copyright (C) 2009 Johannes Schindelin (johannes.schindelin@gmx.de) This program is free software; you can 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 . */ #include "ppm.h" #include "display.h" #include "sdlapp.h" #ifdef _WIN32 #include #include #endif extern "C" { static int dumper_thread(void *arg) { FrameExporter *e = static_cast(arg); e->dumpThr(); return 0; } }; // FrameExporter FrameExporter::FrameExporter() { //this now assumes the display is setup //before the frame exporter is created //(which seems reasonable) rowstride = display.width * 3; pixels1 = new char[display.height * rowstride]; pixels2 = new char[display.height * rowstride]; pixels_out = new char[display.height * rowstride]; pixels_shared_ptr = 0; dumper_thread_state = FRAME_EXPORTER_WAIT; cond = SDL_CreateCond(); mutex = SDL_CreateMutex(); #if SDL_VERSION_ATLEAST(2,0,0) thread = SDL_CreateThread( dumper_thread, "frame_exporter", this ); #else thread = SDL_CreateThread( dumper_thread, this ); #endif } FrameExporter::~FrameExporter() { stop(); SDL_DestroyCond(cond); SDL_DestroyMutex(mutex); pixels_shared_ptr = 0; delete[] pixels1; delete[] pixels2; delete[] pixels_out; } void FrameExporter::stop() { if(!thread) return; if(dumper_thread_state == FRAME_EXPORTER_STOPPED || dumper_thread_state == FRAME_EXPORTER_EXIT) return; SDL_mutexP(mutex); dumper_thread_state = FRAME_EXPORTER_EXIT; SDL_CondSignal(cond); SDL_mutexV(mutex); SDL_WaitThread(thread, 0); thread = 0; } void FrameExporter::dump() { display.mode2D(); glEnable(GL_TEXTURE_2D); glDisable(GL_BLEND); char* next_pixel_ptr = (pixels_shared_ptr == pixels1) ? pixels2 : pixels1; // copy pixels - now the right way up glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, display.width, display.height, GL_RGB, GL_UNSIGNED_BYTE, next_pixel_ptr); // wait for lock before changing the pointer to point to our new buffer SDL_mutexP(mutex); //flip buffer we are pointing at pixels_shared_ptr = next_pixel_ptr; dumper_thread_state = FRAME_EXPORTER_DUMP; SDL_CondSignal(cond); SDL_mutexV(mutex); } void FrameExporter::dumpThr() { SDL_mutexP(mutex); while(dumper_thread_state != FRAME_EXPORTER_EXIT) { dumper_thread_state = FRAME_EXPORTER_WAIT; while (dumper_thread_state == FRAME_EXPORTER_WAIT) { SDL_CondWait(cond, mutex); } if (dumper_thread_state == FRAME_EXPORTER_EXIT) break; if (pixels_shared_ptr != 0) { //invert image for(int y=0;yfail()) { delete output; throw PPMExporterException(outputfile); } } //write header sprintf(ppmheader, "P6\n%d %d 255\n", display.width, display.height); } PPMExporter::~PPMExporter() { stop(); if(filename.size()>0) ((std::fstream*)output)->close(); } void PPMExporter::dumpImpl() { *output << ppmheader; output->write(pixels_out, rowstride * display.height); } gource-0.54/src/core/regex.cpp0000644002342600234260000001375114362112041016124 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "regex.h" Regex::Regex(std::string regex, bool test) { int errornumber; PCRE2_SIZE erroroffset; re = pcre2_compile( (PCRE2_SPTR) regex.c_str(), regex.size(), 0, &errornumber, &erroroffset, NULL ); if(!re) { valid = false; if(!test) { throw RegexCompilationException(regex); } } else { valid = true; } } Regex::Regex(const Regex& regex) { if(regex.isValid()) { re = pcre2_code_copy(regex.re); valid = true; } else { re = 0; valid = false; } } Regex::~Regex() { if(re != 0) pcre2_code_free(re); } bool Regex::isValid() const { return valid; } bool Regex::replace(std::string& str, const std::string& replacement_str) { int offset = replaceOffset(str, replacement_str, 0); return (offset != -1); } bool Regex::replaceAll(std::string& str, const std::string& replacement_str) { int offset = -1; while((offset = replaceOffset(str, replacement_str, offset+1)) != -1 && offset < str.size()); return (offset != -1); } int Regex::replaceOffset(std::string& str, const std::string& replacement_str, int offset) { pcre2_match_data* match_data = pcre2_match_data_create_from_pattern(re, NULL); int rc = pcre2_match( re, (PCRE2_SPTR) str.c_str(), str.size(), offset, 0, match_data, NULL ); //failed match if(rc<1) { pcre2_match_data_free(match_data); return -1; } PCRE2_SIZE* ovector = pcre2_get_ovector_pointer(match_data); // replace matched section of string std::string new_str = str; new_str.replace(ovector[0], ovector[1]-ovector[0], replacement_str); size_t end_offset = ovector[0] + replacement_str.size(); for (int i = 1; i < rc; i++) { int match_start = ovector[2*i]; int match_end = ovector[2*i+1]; std::string matched_str; if(match_start != -1) { matched_str = std::string(str, match_start, match_end-match_start); } // check if 'str' contains $i, if it does, replace with match string size_t string_size = new_str.size(); for(size_t j=0; j* results) { if(results != 0) results->clear(); int offset = matchOffset(str, results, 0); return offset != -1; } bool Regex::matchAll(const std::string& str, std::vector* results) { int offset = 0; int match_count = 0; if(results != 0) results->clear(); int str_size = str.size(); while((offset = matchOffset(str, results, offset)) != -1) { match_count++; if(offset >= str_size) break; } return match_count > 0; } int Regex::matchOffset(const std::string& str, std::vector* results, int offset) { if(offset >= str.size()) return -1; pcre2_match_data* match_data = pcre2_match_data_create_from_pattern(re, NULL); int rc = pcre2_match( re, // To allow ^ to match the start of the remaining string // offset the string before passing it (PCRE2_SPTR)(str.c_str() + offset), str.size() - offset, 0, 0, match_data, NULL ); //failed match if(rc < 1) { pcre2_match_data_free(match_data); return -1; } PCRE2_SIZE* ovector = pcre2_get_ovector_pointer(match_data); if(results != 0) { for (int i = 1; i < rc; i++) { int match_start = ovector[2*i]; int match_end = ovector[2*i+1]; // insert a empty string for non-matching optional regex if(match_start == -1) { results->push_back(std::string("")); } else { std::string match(str, match_start+offset, match_end-match_start); results->push_back(match); } } } int result_offset = ovector[1] + offset; pcre2_match_data_free(match_data); return result_offset; } gource-0.54/src/core/timezone.h0000644002342600234260000000032114362112041016276 0ustar andrewcandrewc#ifndef CORE_TIMEZONE_H #define CORE_TIMEZONE_H #include extern "C" { void init_tz(); void set_utc_tz(); void unset_utc_tz(); time_t mktime_utc(struct tm* timeinfo); }; #endif gource-0.54/src/core/display.h0000644002342600234260000000760614362112041016126 0ustar andrewcandrewc /* Copyright (c) 2008 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SDLAPP_DISPLAY_H #define SDLAPP_DISPLAY_H #include "gl.h" #include "shader.h" #include "logger.h" #include "vectors.h" #include "texture.h" #include "fxfont.h" #include #include #include #include #include class SDLInitException : public std::exception { protected: std::string error; public: SDLInitException(const std::string& error) : error(error) {} virtual ~SDLInitException() throw () {}; virtual const char* what() const throw() { return error.c_str(); } }; class SDLAppDisplay { bool enable_alpha; bool resizable; bool fullscreen; bool frameless; bool experimental; bool high_dpi_aware; bool vsync; int zbuffer_depth; int multi_sample; Uint32 SDLWindowFlags(bool fullscreen); void setupExtensions(); void updateViewportDPIRatio(); public: int width, height; int desktop_width, desktop_height; int windowed_width, windowed_height; vec2 viewport_dpi_ratio; #if SDL_VERSION_ATLEAST(2,0,0) SDL_Window* sdl_window; SDL_GLContext gl_context; int framed_width, framed_height; int framed_x, framed_y; #else SDL_Surface *surface; #endif vec4 clear_colour; SDLAppDisplay(); ~SDLAppDisplay(); void getFullscreenResolution(int& width, int& height); void toggleFullscreen(); void toggleFrameless(); bool isFullscreen() const; bool isFrameless() const; void resize(int width, int height); void init(std::string window_title, int width, int height, bool fullscreen, int screen = -1); void setVideoMode(int width, int height, bool fullscreen, int screen = -1); bool multiSamplingEnabled(); void quit(); void update(); void clear(); void setClearColour(vec3 colour); void setClearColour(vec4 colour); void setZBufferDepth(int zbuffer_depth); void enableVsync(bool vsync); void enableAlpha(bool enable); void enableResize(bool resizable); void enableFrameless(bool frameless); void enableHighDPIAwareness(bool enable); void enableExperimental(bool enable); void multiSample(int sample); void mode3D(float fov, float znear, float zfar); void mode2D(); void push2D(); void pop2D(); vec4 currentColour(); vec3 project(vec3 pos); vec3 unproject(vec2 pos); }; extern SDLAppDisplay display; #endif gource-0.54/src/core/frustum.h0000644002342600234260000000507414362112041016163 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef FRUSTUM_H #define FRUSTUM_H #include "gl.h" #include "plane.h" #include "pi.h" #include "bounds.h" class Frustum { float near_distance, far_distance; float view_ratio; float fov; float near_half_width; float near_half_height; float far_half_width; float far_half_height; vec3 near_top_left, near_top_right; vec3 near_bottom_left, near_bottom_right; vec3 far_top_left, far_top_right; vec3 far_bottom_left, far_bottom_right; Plane planes[6]; public: Frustum(); Frustum(const vec3& source, const vec3& target, const vec3& up, float fov, float near_distance, float far_distance); void update(const vec3& source, const vec3& target, const vec3& up, float fov, float near_distance, float far_distance); void updatePerspective(float fov, float near_distance, float far_distance); void updateView(const vec3& source, const vec3& target, const vec3& up); bool contains(const vec3& p) const; bool intersects(const Bounds3D& bounds) const; bool intersects(const Bounds2D& bounds, float z = 0.0) const; }; #endif gource-0.54/src/core/ppm.h0000644002342600234260000000372614362112041015254 0ustar andrewcandrewc/* Copyright (C) 2009 Johannes Schindelin (johannes.schindelin@gmx.de) This program is free software; you can 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 . */ #ifndef PPM_FRAME_EXPORTER_H #define PPM_FRAME_EXPORTER_H #include #include #include #include #include #include "SDL.h" #include "gl.h" enum { FRAME_EXPORTER_WAIT, FRAME_EXPORTER_DUMP, FRAME_EXPORTER_EXIT, FRAME_EXPORTER_STOPPED }; class FrameExporter { protected: char* pixels1; char* pixels2; char* pixels_out; char* pixels_shared_ptr; size_t rowstride; GLuint screentex; SDL_Thread* thread; SDL_mutex* mutex; SDL_cond* cond; int dumper_thread_state; public: FrameExporter(); virtual ~FrameExporter(); void stop(); void dump(); void dumpThr(); virtual void dumpImpl() {}; }; class PPMExporterException : public std::exception { protected: std::string filename; public: PPMExporterException(std::string& filename) : filename(filename) {} virtual ~PPMExporterException() throw () {}; virtual const char* what() const throw() { return filename.c_str(); } }; class PPMExporter : public FrameExporter { protected: std::ostream* output; std::string filename; char ppmheader[1024]; public: PPMExporter(std::string outputfile); virtual ~PPMExporter(); virtual void dumpImpl(); }; #endif gource-0.54/src/core/mousecursor.h0000644002342600234260000000543214362112041017042 0ustar andrewcandrewc/* Copyright (c) 2010 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SDLAPP_MOUSECURSOR_H #define SDLAPP_MOUSECURSOR_H #include "display.h" class MouseCursor { vec2 mousepos; vec2 rel; bool hidden; bool system_cursor; float idle; float timeout; int scrollwheel; SDL_Cursor* sdl_default_cursor; SDL_Cursor* sdl_hidden_cursor; bool left_click; bool right_click; bool middle_click; TextureResource* cursortex; public: MouseCursor(); ~MouseCursor(); const vec2& getPos() const; const vec2& getRelativePos() const; void leftClick(bool click); void rightClick(bool click); void middleClick(bool click); bool leftClick() const; bool rightClick() const; bool middleClick() const; bool leftButtonPressed() const; bool rightButtonPressed() const; bool bothPressed() const; bool buttonPressed() const; int scrollWheel() const; bool isHidden() const; bool isSystemCursor()const; bool isVisible() const; bool hasFocus() const; void scroll(bool dir); void resetButtonState(); void updateRelativePos(const vec2& rel); void updatePos(const vec2& pos); void showCursor(bool show); void useSystemCursor(bool system_cursor); void setCursorTexture(TextureResource* texture); void logic(float dt); void draw() const; }; #endif gource-0.54/src/core/vbo.cpp0000644002342600234260000001273014362112041015574 0ustar andrewcandrewc/* Copyright (c) 2011 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "vbo.h" //quadbuf quadbuf::quadbuf(int vertex_capacity) : vertex_capacity(vertex_capacity) { vertex_count = 0; data = vertex_capacity > 0 ? new quadbuf_vertex[vertex_capacity] : 0; //fprintf(stderr, "size of quadbuf_vertex = %d\n", sizeof(quadbuf_vertex)); } quadbuf::~quadbuf() { if(data!=0) delete[] data; } void quadbuf::unload() { buf.unload(); } void quadbuf::resize(int new_size) { quadbuf_vertex* _data = data; data = new quadbuf_vertex[new_size]; for(int i=0;i vertex_capacity) { resize(vertex_count*2); } data[i] = v1; data[i+1] = v2; data[i+2] = v3; data[i+3] = v4; if(textureid>0 && (textures.empty() || textures.back().textureid != textureid)) { textures.push_back(quadbuf_tex(i, textureid)); } } void quadbuf::add(GLuint textureid, const quadbuf_vertex& v1, const quadbuf_vertex& v2, const quadbuf_vertex& v3, const quadbuf_vertex& v4) { int i = vertex_count; vertex_count += 4; if(vertex_count > vertex_capacity) { resize(vertex_count*2); } data[i] = v1; data[i+1] = v2; data[i+2] = v3; data[i+3] = v4; if(textureid>0 && (textures.empty() || textures.back().textureid != textureid)) { textures.push_back(quadbuf_tex(i, textureid)); } } void quadbuf::update() { if(vertex_count==0) return; //recreate buffer if less than the vertex_count buf.buffer( vertex_count, sizeof(quadbuf_vertex), vertex_capacity, &(data[0].pos.x), GL_DYNAMIC_DRAW ); } void quadbuf::draw() { if(vertex_count==0) return; buf.bind(); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2, GL_FLOAT, sizeof(quadbuf_vertex), 0); glColorPointer(4, GL_FLOAT, sizeof(quadbuf_vertex), (GLvoid*)8); // offset pos (2x4 bytes) glTexCoordPointer(2, GL_FLOAT, sizeof(quadbuf_vertex), (GLvoid*)24); // offset pos + colour (2x4 + 4x4 bytes) int last_index = vertex_count-1; if(textures.empty()) { glDrawArrays(GL_QUADS, 0, vertex_count); } else { for(std::vector::iterator it = textures.begin(); it != textures.end();) { quadbuf_tex* tex = &(*it); int end_index; it++; if(it == textures.end()) { end_index = last_index; } else { end_index = (*it).start_index; } glBindTexture(GL_TEXTURE_2D, tex->textureid); glDrawArrays(GL_QUADS, tex->start_index, end_index - tex->start_index + 1); if(end_index==last_index) break; } } glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); buf.unbind(); } gource-0.54/src/core/quadtree.h0000644002342600234260000001030414362112041016260 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef QUADTREE_H #define QUADTREE_H #include #include #include "gl.h" #include "bounds.h" #include "frustum.h" class QuadItem { public: Bounds2D quadItemBounds; int node_count; virtual ~QuadItem() {}; virtual void updateQuadItemBounds() {}; virtual void drawQuadItem() {}; }; template class VisitFunctor{ public: virtual void operator()(Data *)=0; }; class QuadTree; class QuadNode { GLuint listid; Bounds2D bounds; std::vector children; std::list items; QuadTree* tree; int getChildIndex(const vec2 & pos) const; void addToChild(QuadItem* item); int depth; QuadNode* parent; public: bool allowMoreItems(); int usedChildren(); QuadNode(QuadTree* tree, QuadNode* parent, Bounds2D itembounds, int parent_depth); ~QuadNode(); void addItem(QuadItem* item); //if not subdivided, subdivide, add to correct subdivided node. int getItemsAt(std::set& itemset, vec2 pos); void getLeavesInFrustum(std::set& nodeset, Frustum& frustum); int getItemsInFrustum(std::set& itemset, Frustum& frustum); int getItemsInBounds(std::set& itemset, Bounds2D& bounds) const; void visitItemsInFrustum(const Frustum & frustum, VisitFunctor & visit); void visitItemsInBounds(const Bounds2D & bounds, VisitFunctor & visit); void visitItemsAt(const vec2 & pos, VisitFunctor & visit); void visitLeavesInFrustum(const Frustum & frustum, VisitFunctor & visit); bool empty(); void generateLists(); int draw(Frustum& frustum); void outline(); void outlineItems(); }; class QuadTree { Bounds2D bounds; QuadNode* root; public: int unique_item_count; int item_count; int node_count; int max_node_depth; int max_node_items; int getItemsAt(std::set& itemset, vec2 pos); void getLeavesInFrustum(std::set& nodeset, Frustum& frustum); int getItemsInFrustum(std::set& itemset, Frustum& frustum); int getItemsInBounds(std::set& itemset, Bounds2D& bounds) const; void visitItemsAt(const vec2 & pos, VisitFunctor & visit); void visitLeavesInFrustum(const Frustum & frustum, VisitFunctor & visit); void visitItemsInFrustum(const Frustum & frustum, VisitFunctor & visit); void visitItemsInBounds(const Bounds2D & bounds, VisitFunctor & visit); void addItem(QuadItem* item); void generateLists(); int drawNodesInFrustum(Frustum& frustum); QuadTree(Bounds2D bounds, int max_node_depth, int max_node_items); ~QuadTree(); void outline(); void outlineItems(); }; #endif gource-0.54/src/core/stringhash.h0000644002342600234260000000343514362112041016627 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef STRINGHASH_H #define STRINGHASH_H #include #include "vectors.h" //basic string hash algorithm int stringHash(const std::string& str); vec2 vec2Hash(const std::string& str); vec3 vec3Hash(const std::string& str); vec3 colourHash(const std::string& str); extern int gStringHashSeed; #endif gource-0.54/src/core/texture.cpp0000644002342600234260000001732114362112041016507 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "texture.h" #include "display.h" TextureManager texturemanager; // texture manager TextureManager::TextureManager() : ResourceManager() { resource_seq = 0; trilinear = true; } TextureResource* TextureManager::grabFile(const std::string& filename, bool mipmaps, GLint wrap) { return grab(filename, mipmaps, wrap, true); } TextureResource* TextureManager::grab(const std::string& filename, bool mipmaps, GLint wrap, bool external) { TextureResource* r = 0; //look up this resource if((r = (TextureResource*) resources[filename]) != 0) { r->addref(); return r; } r = new TextureResource(filename, mipmaps, wrap, external); r->load(); addResource(r); return r; } void TextureManager::addResource(TextureResource* r) { if(r->resource_name.empty()) { char res_name[256]; snprintf(res_name, 256, "__texture_resource_%d", ++resource_seq); std::string resource_name(res_name); r->setResourceName(resource_name); } resources[r->resource_name] = r; r->addref(); } TextureResource* TextureManager::create(GLenum target) { TextureResource* r = new TextureResource(); r->target = target; r->load(); addResource(r); return (TextureResource*)r; } TextureResource* TextureManager::create(int width, int height, bool mipmaps, GLint wrap, GLenum format, GLubyte* data) { TextureResource* r = new TextureResource(width, height, mipmaps, wrap, format, data); r->load(); addResource(r); return (TextureResource*)r; } void TextureManager::unload() { for(std::map::iterator it= resources.begin(); it!=resources.end();it++) { ((TextureResource*)it->second)->unload(); } } void TextureManager::reload() { for(std::map::iterator it= resources.begin(); it!=resources.end();it++) { ((TextureResource*)it->second)->load(); } } // TextureResource TextureResource::TextureResource() { textureid = 0; w = 0; h = 0; format = 0; data = 0; wrap = GL_CLAMP_TO_EDGE; target = GL_TEXTURE_2D; mipmaps = false; setDefaultFiltering(); } TextureResource::TextureResource(const std::string& filename, bool mipmaps, GLint wrap, bool external) : Resource(filename) { this->mipmaps = mipmaps; this->wrap = wrap; data = 0; format = 0; textureid = 0; target = GL_TEXTURE_2D; //if doesnt have an absolute path, look in resource dir if(!external && !(filename.size() > 2 && filename[1] == ':') && !(filename.size() > 1 && filename[0] == '/')) { this->filename = texturemanager.getDir() + filename; } else { this->filename = filename; } setDefaultFiltering(); } TextureResource::TextureResource(int width, int height, bool mipmaps, GLint wrap, GLenum format, GLubyte* data) { this->w = width; this->h = height; this->data = data; this->format = format; this->mipmaps = mipmaps; this->wrap = wrap; this->target = GL_TEXTURE_2D; textureid = 0; setDefaultFiltering(); } TextureResource::~TextureResource() { unload(); } void TextureResource::setDefaultFiltering() { if(mipmaps) { if(texturemanager.trilinear) { min_filter = GL_LINEAR_MIPMAP_LINEAR; } else { min_filter = GL_LINEAR_MIPMAP_NEAREST; } mag_filter = GL_LINEAR; } else { min_filter = GL_LINEAR; mag_filter = GL_LINEAR; } } void TextureResource::setFiltering(GLint min_filter, GLint mag_filter) { this->min_filter = min_filter; this->mag_filter = mag_filter; glTexParameteri(target, GL_TEXTURE_MIN_FILTER, min_filter); glTexParameteri(target, GL_TEXTURE_MAG_FILTER, mag_filter); } void TextureResource::setWrapStyle(GLint wrap) { this->wrap = wrap; glTexParameteri(target, GL_TEXTURE_WRAP_S, wrap); glTexParameteri(target, GL_TEXTURE_WRAP_T, wrap); } void TextureResource::unload() { if(textureid!=0) glDeleteTextures(1, &textureid); textureid=0; } void TextureResource::createTexture() { if(!textureid) glGenTextures(1, &textureid); glBindTexture(target, textureid); if(w != 0 && format != 0) { GLint internalFormat = 0; switch(format) { case GL_ALPHA: internalFormat = GL_ALPHA; break; case GL_LUMINANCE: internalFormat = GL_LUMINANCE; break; default: internalFormat = GL_RGBA; break; } if(mipmaps) { gluBuild2DMipmaps(target, internalFormat, w, h, format, GL_UNSIGNED_BYTE, data); } else { glTexImage2D(target, 0, internalFormat, w, h, 0, format, GL_UNSIGNED_BYTE, data); } } setFiltering(min_filter, mag_filter); setWrapStyle(wrap); } void TextureResource::reload() { load(true); } void TextureResource::load(bool reload) { if(textureid != 0) { if(!reload) return; debugLog("texture %d is being reloaded", textureid); } SDL_Surface *surface = 0; if(!filename.empty()) { debugLog("creating texture from %s", filename.c_str()); surface = IMG_Load(filename.c_str()); if(surface==0) throw TextureException(filename); w = surface->w; h = surface->h; //figure out image colour order format = colourFormat(surface); data = (GLubyte*) surface->pixels; if(format==0) throw TextureException(filename); } createTexture(); if(surface != 0) { SDL_FreeSurface(surface); data = 0; } } GLenum TextureResource::colourFormat(SDL_Surface* surface) { int colours = surface->format->BytesPerPixel; int format = 0; if (colours == 4) { if (surface->format->Rmask == 0x000000ff) { format = GL_RGBA; } else { format = GL_BGRA; } } else if (colours == 3) { if (surface->format->Rmask == 0x000000ff) format = GL_RGB; else format = GL_BGR; } return format; } void TextureResource::bind() { if(!textureid) load(); glBindTexture(target, textureid); } gource-0.54/src/core/shader_common.h0000644002342600234260000003273414362112041017277 0ustar andrewcandrewc#ifndef SHADER_COMMON_H #define SHADER_COMMON_H #include "resource.h" #include "regex.h" #include "vectors.h" #include #include #include #include #include extern std::string gSDLAppShaderDir; enum { SHADER_UNIFORM_INT, SHADER_UNIFORM_FLOAT, SHADER_UNIFORM_BOOL, SHADER_UNIFORM_SAMPLER_1D, SHADER_UNIFORM_SAMPLER_2D, SHADER_UNIFORM_SAMPLER_3D, SHADER_UNIFORM_VEC2, SHADER_UNIFORM_VEC3, SHADER_UNIFORM_VEC4, SHADER_UNIFORM_MAT3, SHADER_UNIFORM_MAT4, SHADER_UNIFORM_INT_ARRAY, SHADER_UNIFORM_FLOAT_ARRAY, SHADER_UNIFORM_VEC2_ARRAY, SHADER_UNIFORM_VEC3_ARRAY, SHADER_UNIFORM_VEC4_ARRAY }; extern Regex Shader_pre_version; extern Regex Shader_pre_extension; extern Regex Shader_pre_include; extern Regex Shader_uniform_def; extern Regex Shader_error_line; extern Regex Shader_error2_line; extern Regex Shader_error3_line; extern Regex Shader_warning_line; extern Regex Shader_redefine_line; class ShaderException : public std::exception { protected: std::string message; std::string source; public: ShaderException(const std::string& message); ShaderException(const std::string& message, const std::string& source); ~ShaderException() throw () {}; virtual const char* what() const throw() { return message.c_str(); } const std::string& getSource() const; }; class AbstractShader; class ShaderUniform { protected: std::string name; std::string comment; int location; AbstractShader* shader; int uniform_type; std::string type_name; bool modified; bool initialized; bool baked; public: ShaderUniform(AbstractShader* shader, const std::string& name, int uniform_type, const std::string& type_name); virtual ~ShaderUniform() {}; virtual void unload(); int getLocation(); int getType() { return uniform_type; }; virtual void write(std::string& content) const {}; const std::string& getName() const; bool isInitialized() const { return initialized; }; bool isBaked() const { return baked; }; bool isModified() const { return modified; }; void setComment(const std::string& comment); const std::string& getComment() const; void setInitialized(bool initialized) { this->initialized = initialized; }; virtual void setBaked(bool baked); virtual void setModified(bool modified) { this->modified = modified; }; }; class FloatShaderUniform : public ShaderUniform { float value; public: FloatShaderUniform(AbstractShader* shader, const std::string& name, float value = 0.0f); void write(std::string& content) const; void setValue(float value); float& getValue(); }; class IntShaderUniform : public ShaderUniform { int value; public: IntShaderUniform(AbstractShader* shader, const std::string& name, int value = 0); void write(std::string& content) const; void setValue(int value); int& getValue(); }; class BoolShaderUniform : public ShaderUniform { bool value; public: BoolShaderUniform(AbstractShader* shader, const std::string& name, bool value = false); void write(std::string& content) const; void setValue(bool value); bool& getValue(); }; class Sampler1DShaderUniform : public ShaderUniform { int value; public: Sampler1DShaderUniform(AbstractShader* shader, const std::string& name, int value = 0); void write(std::string& content) const; void setBaked(bool baked); void setValue(int value); int& getValue(); }; class Sampler2DShaderUniform : public ShaderUniform { int value; public: Sampler2DShaderUniform(AbstractShader* shader, const std::string& name, int value = 0); void write(std::string& content) const; void setBaked(bool baked); void setValue(int value); int& getValue(); }; class Sampler3DShaderUniform : public ShaderUniform { int value; public: Sampler3DShaderUniform(AbstractShader* shader, const std::string& name, int value = 0); void write(std::string& content) const; void setBaked(bool baked); void setValue(int value); int& getValue(); }; class Vec2ShaderUniform : public ShaderUniform { vec2 value; public: Vec2ShaderUniform(AbstractShader* shader, const std::string& name, const vec2& value = vec2(0.0f)) ; void write(std::string& content) const; void setValue(const vec2& value); vec2& getValue(); }; class Vec3ShaderUniform : public ShaderUniform { vec3 value; public: Vec3ShaderUniform(AbstractShader* shader, const std::string& name, const vec3& value = vec3(0.0f)); void write(std::string& content) const; void setValue(const vec3& value); vec3& getValue(); }; class Vec4ShaderUniform : public ShaderUniform { vec4 value; public: Vec4ShaderUniform(AbstractShader* shader, const std::string& name, const vec4& value = vec4(0.0f)); void write(std::string& content) const; void setValue(const vec4& value); vec4& getValue(); }; class Mat3ShaderUniform : public ShaderUniform { mat3 value; public: Mat3ShaderUniform(AbstractShader* shader, const std::string& name, const mat3& value = mat3(1.0f)); void write(std::string& content) const; void setValue(const mat3& value); mat3& getValue(); }; class Mat4ShaderUniform : public ShaderUniform { mat4 value; public: Mat4ShaderUniform(AbstractShader* shader, const std::string& name, const mat4& value = mat4(1.0f)); void write(std::string& content) const; void setValue(const mat4& value); mat4& getValue(); }; class IntegerArrayShaderUniform : public ShaderUniform { std::vector value; size_t length; void copyValue(const std::vector& value); public: IntegerArrayShaderUniform(AbstractShader* shader, const std::string& name, size_t length); ~IntegerArrayShaderUniform(); void write(std::string& content) const; void setValue(const std::vector& value); const std::vector& getValue(); size_t getLength() const; }; class FloatArrayShaderUniform : public ShaderUniform { std::vector value; size_t length; void copyValue(const std::vector& value); public: FloatArrayShaderUniform(AbstractShader* shader, const std::string& name, size_t length); ~FloatArrayShaderUniform(); void write(std::string& content) const; void setValue(const std::vector& value); const std::vector& getValue(); size_t getLength() const; }; class Vec2ArrayShaderUniform : public ShaderUniform { std::vector value; size_t length; void copyValue(const vec2* value); void copyValue(const std::vector& value); public: Vec2ArrayShaderUniform(AbstractShader* shader, const std::string& name, size_t length, const vec2* value = 0); ~Vec2ArrayShaderUniform(); void write(std::string& content) const; void setValue(const vec2* value); void setValue(const std::vector& value); const std::vector& getValue(); size_t getLength() const; }; class Vec3ArrayShaderUniform : public ShaderUniform { std::vector value; size_t length; void copyValue(const vec3* value); void copyValue(const std::vector& value); public: Vec3ArrayShaderUniform(AbstractShader* shader, const std::string& name, size_t length, const vec3* value = 0); ~Vec3ArrayShaderUniform(); void write(std::string& content) const; void setValue(const vec3* value); void setValue(const std::vector& value); const std::vector& getValue(); size_t getLength() const; }; class Vec4ArrayShaderUniform : public ShaderUniform { std::vector value; size_t length; void copyValue(const vec4* value); void copyValue(const std::vector& value); public: Vec4ArrayShaderUniform(AbstractShader* shader, const std::string& name, size_t length, const vec4* value = 0); ~Vec4ArrayShaderUniform(); void write(std::string& content) const; void setValue(const vec4* value); void setValue(const std::vector& value); const std::vector& getValue(); size_t getLength() const; }; class ShaderPart { std::string filename; std::string raw_source; std::string processed_source; std::map defines; std::map substitutions; void preprocess(); void loadSourceFile(); void applySubstitution(std::string& source, const std::string& name, const std::string& value); void applyDefines(std::string& source); void applySubstitutions(std::string& source); public: ShaderPart(); void setSourceFile(const std::string& filename); void setSource(const std::string& source); void reload(); void reset(); void substitute(const std::string& name, const char *value, ...); void substitute(const std::string& name, const std::string& value); void define(const std::string& name); void define(const std::string& name, const char *value, ...); void define(const std::string& name, const std::string& value); const std::string& getSource(); }; class AbstractShaderPass { protected: int shader_object_type; std::string shader_object_desc; unsigned int shader_object; int version; std::map extensions; AbstractShader* parent; std::string source; std::string shader_object_source; std::list uniforms; void showContext(std::string& context, int line_no, int amount); bool errorContext(const std::string& log_message, std::string& context); bool preprocess(const std::string& line); public: AbstractShaderPass(AbstractShader* parent, int shader_object_type, const std::string& shader_object_desc); virtual ~AbstractShaderPass() {}; int getType() { return shader_object_type; }; bool isEmpty(); void toString(std::string& out); const std::string& getObjectSource(); ShaderUniform* addArrayUniform(const std::string& name, const std::string& type, size_t length); ShaderUniform* addUniform(const std::string& name, const std::string& type); void includeSource(const std::string& source); void includeFile(const std::string& filename); std::list& getUniforms(); virtual void attachTo(unsigned int program) = 0; virtual void unload() = 0; virtual void compile() = 0; virtual void checkError() = 0; }; class AbstractShader : public Resource { protected: std::map uniforms; std::list uniform_list; std::map substitutions; std::string prefix; unsigned int program; bool dynamic_compile; void setDefaults(); virtual void loadPrefix() = 0; virtual void checkProgramError() = 0; public: AbstractShaderPass* vertex_shader; AbstractShaderPass* geometry_shader; AbstractShaderPass* compute_shader; AbstractShaderPass* fragment_shader; AbstractShader(); AbstractShader(const std::string& prefix); unsigned int getProgram(); void clear(); void reload(bool force = false); bool isEmpty(); void includeSource(unsigned int shader_object_type, const std::string& source); void includeFile(unsigned int shader_object_type, const std::string& filename); static void substitute(std::string& source, const std::string& name, const std::string& value); void addSubstitute(const std::string& name, const std::string& value); void addSubstitute(const std::string& name, const char *value, ...); void applySubstitutions(std::string& source); void addUniform(ShaderUniform* uniform); ShaderUniform* getUniform(const std::string& name); void setDynamicCompile(bool dynamic_compile); bool needsCompile(); const std::list& getUniforms(); void applyUniforms(); void setBool(const std::string& name, bool value); void setInteger (const std::string& name, int value); void setSampler1D(const std::string& name, int value); void setSampler2D(const std::string& name, int value); void setSampler3D(const std::string& name, int value); void setFloat(const std::string& name, float value); void setVec2 (const std::string& name, const vec2& value); void setVec3 (const std::string& name, const vec3& value); void setVec4 (const std::string& name, const vec4& value); void setMat3 (const std::string& name, const mat3& value); void setMat4 (const std::string& name, const mat4& value); void setIntegerArray(const std::string& name, std::vector& value); void setFloatArray(const std::string& name, std::vector& value); void setVec2Array(const std::string& name, vec2* value); void setVec2Array(const std::string& name, std::vector& value); void setVec3Array(const std::string& name, vec3* value); void setVec3Array(const std::string& name, std::vector& value); void setVec4Array(const std::string& name, vec4* value); void setVec4Array(const std::string& name, std::vector& value); void setBaked(const std::string& name, bool baked); void setBakedUniforms(bool baked); virtual AbstractShaderPass* grabShaderPass(unsigned int shader_object_type) = 0; virtual void applyUniform(ShaderUniform* u) = 0; virtual int getUniformLocation(const std::string& uniform_name) = 0; virtual void compile() = 0; virtual void link() = 0; virtual void load() = 0; virtual void unload() = 0; virtual void bind() = 0; virtual void unbind() = 0; void use(); }; #endif gource-0.54/src/core/utf8/0000755002342600234260000000000014362112041015165 5ustar andrewcandrewcgource-0.54/src/core/utf8/checked.h0000644002342600234260000003016114362112041016725 0ustar andrewcandrewc// Copyright 2006-2016 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "core.h" #include namespace utf8 { // Base for the exceptions that may be thrown from the library class exception : public ::std::exception { }; // Exceptions that may be thrown from the library functions. class invalid_code_point : public exception { uint32_t cp; public: invalid_code_point(uint32_t codepoint) : cp(codepoint) {} virtual const char* what() const UTF_CPP_NOEXCEPT UTF_CPP_OVERRIDE { return "Invalid code point"; } uint32_t code_point() const {return cp;} }; class invalid_utf8 : public exception { uint8_t u8; public: invalid_utf8 (uint8_t u) : u8(u) {} virtual const char* what() const UTF_CPP_NOEXCEPT UTF_CPP_OVERRIDE { return "Invalid UTF-8"; } uint8_t utf8_octet() const {return u8;} }; class invalid_utf16 : public exception { uint16_t u16; public: invalid_utf16 (uint16_t u) : u16(u) {} virtual const char* what() const UTF_CPP_NOEXCEPT UTF_CPP_OVERRIDE { return "Invalid UTF-16"; } uint16_t utf16_word() const {return u16;} }; class not_enough_room : public exception { public: virtual const char* what() const UTF_CPP_NOEXCEPT UTF_CPP_OVERRIDE { return "Not enough space"; } }; /// The library API - functions intended to be called by the users template octet_iterator append(uint32_t cp, octet_iterator result) { if (!utf8::internal::is_code_point_valid(cp)) throw invalid_code_point(cp); if (cp < 0x80) // one octet *(result++) = static_cast(cp); else if (cp < 0x800) { // two octets *(result++) = static_cast((cp >> 6) | 0xc0); *(result++) = static_cast((cp & 0x3f) | 0x80); } else if (cp < 0x10000) { // three octets *(result++) = static_cast((cp >> 12) | 0xe0); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } else { // four octets *(result++) = static_cast((cp >> 18) | 0xf0); *(result++) = static_cast(((cp >> 12) & 0x3f) | 0x80); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } return result; } template output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) { while (start != end) { octet_iterator sequence_start = start; internal::utf_error err_code = utf8::internal::validate_next(start, end); switch (err_code) { case internal::UTF8_OK : for (octet_iterator it = sequence_start; it != start; ++it) *out++ = *it; break; case internal::NOT_ENOUGH_ROOM: out = utf8::append (replacement, out); start = end; break; case internal::INVALID_LEAD: out = utf8::append (replacement, out); ++start; break; case internal::INCOMPLETE_SEQUENCE: case internal::OVERLONG_SEQUENCE: case internal::INVALID_CODE_POINT: out = utf8::append (replacement, out); ++start; // just one replacement mark for the sequence while (start != end && utf8::internal::is_trail(*start)) ++start; break; } } return out; } template inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) { static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); return utf8::replace_invalid(start, end, out, replacement_marker); } template uint32_t next(octet_iterator& it, octet_iterator end) { uint32_t cp = 0; internal::utf_error err_code = utf8::internal::validate_next(it, end, cp); switch (err_code) { case internal::UTF8_OK : break; case internal::NOT_ENOUGH_ROOM : throw not_enough_room(); case internal::INVALID_LEAD : case internal::INCOMPLETE_SEQUENCE : case internal::OVERLONG_SEQUENCE : throw invalid_utf8(*it); case internal::INVALID_CODE_POINT : throw invalid_code_point(cp); } return cp; } template uint32_t peek_next(octet_iterator it, octet_iterator end) { return utf8::next(it, end); } template uint32_t prior(octet_iterator& it, octet_iterator start) { // can't do much if it == start if (it == start) throw not_enough_room(); octet_iterator end = it; // Go back until we hit either a lead octet or start while (utf8::internal::is_trail(*(--it))) if (it == start) throw invalid_utf8(*it); // error - no lead byte in the sequence return utf8::peek_next(it, end); } template void advance (octet_iterator& it, distance_type n, octet_iterator end) { const distance_type zero(0); if (n < zero) { // backward for (distance_type i = n; i < zero; ++i) utf8::prior(it, end); } else { // forward for (distance_type i = zero; i < n; ++i) utf8::next(it, end); } } template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last) { typename std::iterator_traits::difference_type dist; for (dist = 0; first < last; ++dist) utf8::next(first, last); return dist; } template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) { while (start != end) { uint32_t cp = utf8::internal::mask16(*start++); // Take care of surrogate pairs first if (utf8::internal::is_lead_surrogate(cp)) { if (start != end) { uint32_t trail_surrogate = utf8::internal::mask16(*start++); if (utf8::internal::is_trail_surrogate(trail_surrogate)) cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; else throw invalid_utf16(static_cast(trail_surrogate)); } else throw invalid_utf16(static_cast(cp)); } // Lone trail surrogate else if (utf8::internal::is_trail_surrogate(cp)) throw invalid_utf16(static_cast(cp)); result = utf8::append(cp, result); } return result; } template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) { while (start < end) { uint32_t cp = utf8::next(start, end); if (cp > 0xffff) { //make a surrogate pair *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); } else *result++ = static_cast(cp); } return result; } template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) { while (start != end) result = utf8::append(*(start++), result); return result; } template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) { while (start < end) (*result++) = utf8::next(start, end); return result; } // The iterator class template class iterator { octet_iterator it; octet_iterator range_start; octet_iterator range_end; public: typedef uint32_t value_type; typedef uint32_t* pointer; typedef uint32_t& reference; typedef std::ptrdiff_t difference_type; typedef std::bidirectional_iterator_tag iterator_category; iterator () {} explicit iterator (const octet_iterator& octet_it, const octet_iterator& rangestart, const octet_iterator& rangeend) : it(octet_it), range_start(rangestart), range_end(rangeend) { if (it < range_start || it > range_end) throw std::out_of_range("Invalid utf-8 iterator position"); } // the default "big three" are OK octet_iterator base () const { return it; } uint32_t operator * () const { octet_iterator temp = it; return utf8::next(temp, range_end); } bool operator == (const iterator& rhs) const { if (range_start != rhs.range_start || range_end != rhs.range_end) throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); return (it == rhs.it); } bool operator != (const iterator& rhs) const { return !(operator == (rhs)); } iterator& operator ++ () { utf8::next(it, range_end); return *this; } iterator operator ++ (int) { iterator temp = *this; utf8::next(it, range_end); return temp; } iterator& operator -- () { utf8::prior(it, range_start); return *this; } iterator operator -- (int) { iterator temp = *this; utf8::prior(it, range_start); return temp; } }; // class iterator } // namespace utf8 #if UTF_CPP_CPLUSPLUS >= 201103L // C++ 11 or later #include "cpp11.h" #endif // C++ 11 or later #endif //header guard gource-0.54/src/core/utf8/unchecked.h0000644002342600234260000002535514362112041017301 0ustar andrewcandrewc// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "core.h" namespace utf8 { namespace unchecked { template octet_iterator append(uint32_t cp, octet_iterator result) { if (cp < 0x80) // one octet *(result++) = static_cast(cp); else if (cp < 0x800) { // two octets *(result++) = static_cast((cp >> 6) | 0xc0); *(result++) = static_cast((cp & 0x3f) | 0x80); } else if (cp < 0x10000) { // three octets *(result++) = static_cast((cp >> 12) | 0xe0); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } else { // four octets *(result++) = static_cast((cp >> 18) | 0xf0); *(result++) = static_cast(((cp >> 12) & 0x3f)| 0x80); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } return result; } template output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) { while (start != end) { octet_iterator sequence_start = start; internal::utf_error err_code = utf8::internal::validate_next(start, end); switch (err_code) { case internal::UTF8_OK : for (octet_iterator it = sequence_start; it != start; ++it) *out++ = *it; break; case internal::NOT_ENOUGH_ROOM: out = utf8::unchecked::append (replacement, out); start = end; break; case internal::INVALID_LEAD: out = utf8::unchecked::append (replacement, out); ++start; break; case internal::INCOMPLETE_SEQUENCE: case internal::OVERLONG_SEQUENCE: case internal::INVALID_CODE_POINT: out = utf8::unchecked::append (replacement, out); ++start; // just one replacement mark for the sequence while (start != end && utf8::internal::is_trail(*start)) ++start; break; } } return out; } template inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) { static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); return utf8::unchecked::replace_invalid(start, end, out, replacement_marker); } template uint32_t next(octet_iterator& it) { uint32_t cp = utf8::internal::mask8(*it); typename std::iterator_traits::difference_type length = utf8::internal::sequence_length(it); switch (length) { case 1: break; case 2: it++; cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f); break; case 3: ++it; cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); ++it; cp += (*it) & 0x3f; break; case 4: ++it; cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); ++it; cp += (utf8::internal::mask8(*it) << 6) & 0xfff; ++it; cp += (*it) & 0x3f; break; } ++it; return cp; } template uint32_t peek_next(octet_iterator it) { return utf8::unchecked::next(it); } template uint32_t prior(octet_iterator& it) { while (utf8::internal::is_trail(*(--it))) ; octet_iterator temp = it; return utf8::unchecked::next(temp); } template void advance (octet_iterator& it, distance_type n) { const distance_type zero(0); if (n < zero) { // backward for (distance_type i = n; i < zero; ++i) utf8::unchecked::prior(it); } else { // forward for (distance_type i = zero; i < n; ++i) utf8::unchecked::next(it); } } template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last) { typename std::iterator_traits::difference_type dist; for (dist = 0; first < last; ++dist) utf8::unchecked::next(first); return dist; } template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) { while (start != end) { uint32_t cp = utf8::internal::mask16(*start++); // Take care of surrogate pairs first if (utf8::internal::is_lead_surrogate(cp)) { uint32_t trail_surrogate = utf8::internal::mask16(*start++); cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; } result = utf8::unchecked::append(cp, result); } return result; } template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) { while (start < end) { uint32_t cp = utf8::unchecked::next(start); if (cp > 0xffff) { //make a surrogate pair *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); } else *result++ = static_cast(cp); } return result; } template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) { while (start != end) result = utf8::unchecked::append(*(start++), result); return result; } template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) { while (start < end) (*result++) = utf8::unchecked::next(start); return result; } // The iterator class template class iterator { octet_iterator it; public: typedef uint32_t value_type; typedef uint32_t* pointer; typedef uint32_t& reference; typedef std::ptrdiff_t difference_type; typedef std::bidirectional_iterator_tag iterator_category; iterator () {} explicit iterator (const octet_iterator& octet_it): it(octet_it) {} // the default "big three" are OK octet_iterator base () const { return it; } uint32_t operator * () const { octet_iterator temp = it; return utf8::unchecked::next(temp); } bool operator == (const iterator& rhs) const { return (it == rhs.it); } bool operator != (const iterator& rhs) const { return !(operator == (rhs)); } iterator& operator ++ () { ::std::advance(it, utf8::internal::sequence_length(it)); return *this; } iterator operator ++ (int) { iterator temp = *this; ::std::advance(it, utf8::internal::sequence_length(it)); return temp; } iterator& operator -- () { utf8::unchecked::prior(it); return *this; } iterator operator -- (int) { iterator temp = *this; utf8::unchecked::prior(it); return temp; } }; // class iterator } // namespace utf8::unchecked } // namespace utf8 #endif // header guard gource-0.54/src/core/utf8/utf8.h0000644002342600234260000000274714362112041016236 0ustar andrewcandrewc// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "checked.h" #include "unchecked.h" #endif // header guard gource-0.54/src/core/utf8/cpp11.h0000644002342600234260000000635214362112041016270 0ustar andrewcandrewc// Copyright 2018 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_a184c22c_d012_11e8_a8d5_f2801f1b9fd1 #define UTF8_FOR_CPP_a184c22c_d012_11e8_a8d5_f2801f1b9fd1 #include "checked.h" #include namespace utf8 { inline void append(char32_t cp, std::string& s) { append(uint32_t(cp), std::back_inserter(s)); } inline std::string utf16to8(const std::u16string& s) { std::string result; utf16to8(s.begin(), s.end(), std::back_inserter(result)); return result; } inline std::u16string utf8to16(const std::string& s) { std::u16string result; utf8to16(s.begin(), s.end(), std::back_inserter(result)); return result; } inline std::string utf32to8(const std::u32string& s) { std::string result; utf32to8(s.begin(), s.end(), std::back_inserter(result)); return result; } inline std::u32string utf8to32(const std::string& s) { std::u32string result; utf8to32(s.begin(), s.end(), std::back_inserter(result)); return result; } inline std::size_t find_invalid(const std::string& s) { std::string::const_iterator invalid = find_invalid(s.begin(), s.end()); return (invalid == s.end()) ? std::string::npos : (invalid - s.begin()); } inline bool is_valid(const std::string& s) { return is_valid(s.begin(), s.end()); } inline std::string replace_invalid(const std::string& s, char32_t replacement) { std::string result; replace_invalid(s.begin(), s.end(), std::back_inserter(result), replacement); return result; } inline std::string replace_invalid(const std::string& s) { std::string result; replace_invalid(s.begin(), s.end(), std::back_inserter(result)); return result; } inline bool starts_with_bom(const std::string& s) { return starts_with_bom(s.begin(), s.end()); } } // namespace utf8 #endif // header guard gource-0.54/src/core/utf8/core.h0000644002342600234260000002526014362112041016273 0ustar andrewcandrewc// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include // Determine the C++ standard version. // If the user defines UTF_CPP_CPLUSPLUS, use that. // Otherwise, trust the unreliable predefined macro __cplusplus #if !defined UTF_CPP_CPLUSPLUS #define UTF_CPP_CPLUSPLUS __cplusplus #endif #if UTF_CPP_CPLUSPLUS >= 201103L // C++ 11 or later #define UTF_CPP_OVERRIDE override #define UTF_CPP_NOEXCEPT noexcept #else // C++ 98/03 #define UTF_CPP_OVERRIDE #define UTF_CPP_NOEXCEPT throw() #endif // C++ 11 or later namespace utf8 { // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers // You may need to change them to match your system. // These typedefs have the same names as ones from cstdint, or boost/cstdint typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; // Helper code - not intended to be directly called by the library users. May be changed at any time namespace internal { // Unicode constants // Leading (high) surrogates: 0xd800 - 0xdbff // Trailing (low) surrogates: 0xdc00 - 0xdfff const uint16_t LEAD_SURROGATE_MIN = 0xd800u; const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; const uint16_t LEAD_OFFSET = 0xd7c0u; // LEAD_SURROGATE_MIN - (0x10000 >> 10) const uint32_t SURROGATE_OFFSET = 0xfca02400u; // 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN // Maximum valid value for a Unicode code point const uint32_t CODE_POINT_MAX = 0x0010ffffu; template inline uint8_t mask8(octet_type oc) { return static_cast(0xff & oc); } template inline uint16_t mask16(u16_type oc) { return static_cast(0xffff & oc); } template inline bool is_trail(octet_type oc) { return ((utf8::internal::mask8(oc) >> 6) == 0x2); } template inline bool is_lead_surrogate(u16 cp) { return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); } template inline bool is_trail_surrogate(u16 cp) { return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); } template inline bool is_surrogate(u16 cp) { return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); } template inline bool is_code_point_valid(u32 cp) { return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp)); } template inline typename std::iterator_traits::difference_type sequence_length(octet_iterator lead_it) { uint8_t lead = utf8::internal::mask8(*lead_it); if (lead < 0x80) return 1; else if ((lead >> 5) == 0x6) return 2; else if ((lead >> 4) == 0xe) return 3; else if ((lead >> 3) == 0x1e) return 4; else return 0; } template inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) { if (cp < 0x80) { if (length != 1) return true; } else if (cp < 0x800) { if (length != 2) return true; } else if (cp < 0x10000) { if (length != 3) return true; } return false; } enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; /// Helper for get_sequence_x template utf_error increase_safely(octet_iterator& it, octet_iterator end) { if (++it == end) return NOT_ENOUGH_ROOM; if (!utf8::internal::is_trail(*it)) return INCOMPLETE_SEQUENCE; return UTF8_OK; } #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;} /// get_sequence_x functions decode utf-8 sequences of the length x template utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); return UTF8_OK; } template utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f); return UTF8_OK; } template utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (*it) & 0x3f; return UTF8_OK; } template utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (utf8::internal::mask8(*it) << 6) & 0xfff; UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (*it) & 0x3f; return UTF8_OK; } #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR template utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; // Save the original value of it so we can go back in case of failure // Of course, it does not make much sense with i.e. stream iterators octet_iterator original_it = it; uint32_t cp = 0; // Determine the sequence length based on the lead octet typedef typename std::iterator_traits::difference_type octet_difference_type; const octet_difference_type length = utf8::internal::sequence_length(it); // Get trail octets and calculate the code point utf_error err = UTF8_OK; switch (length) { case 0: return INVALID_LEAD; case 1: err = utf8::internal::get_sequence_1(it, end, cp); break; case 2: err = utf8::internal::get_sequence_2(it, end, cp); break; case 3: err = utf8::internal::get_sequence_3(it, end, cp); break; case 4: err = utf8::internal::get_sequence_4(it, end, cp); break; } if (err == UTF8_OK) { // Decoding succeeded. Now, security checks... if (utf8::internal::is_code_point_valid(cp)) { if (!utf8::internal::is_overlong_sequence(cp, length)){ // Passed! Return here. code_point = cp; ++it; return UTF8_OK; } else err = OVERLONG_SEQUENCE; } else err = INVALID_CODE_POINT; } // Failure branch - restore the original value of the iterator it = original_it; return err; } template inline utf_error validate_next(octet_iterator& it, octet_iterator end) { uint32_t ignored; return utf8::internal::validate_next(it, end, ignored); } } // namespace internal /// The library API - functions intended to be called by the users // Byte order mark const uint8_t bom[] = {0xef, 0xbb, 0xbf}; template octet_iterator find_invalid(octet_iterator start, octet_iterator end) { octet_iterator result = start; while (result != end) { utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end); if (err_code != internal::UTF8_OK) return result; } return result; } template inline bool is_valid(octet_iterator start, octet_iterator end) { return (utf8::find_invalid(start, end) == end); } template inline bool starts_with_bom (octet_iterator it, octet_iterator end) { return ( ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) && ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) ); } } // namespace utf8 #endif // header guard gource-0.54/src/core/regex.h0000644002342600234260000000513614362112041015567 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef REGEX_H #define REGEX_H #define PCRE2_CODE_UNIT_WIDTH 8 #include #include #include #include class RegexCompilationException : public std::exception { protected: std::string regex; public: RegexCompilationException(std::string& regex) : regex(regex) {} virtual ~RegexCompilationException() throw () {}; virtual const char* what() const throw() { return regex.c_str(); } }; class Regex { protected: pcre2_code *re; bool valid; int replaceOffset(std::string& str, const std::string& replacement_str, int offset=0); int matchOffset(const std::string& str, std::vector* results = 0, int offset=0); public: Regex(std::string regex, bool test = false); Regex(const Regex& regex); ~Regex(); bool match(const std::string& str, std::vector* results = 0); bool matchAll(const std::string& str, std::vector* results = 0); bool replace(std::string& str, const std::string& replacement_str); bool replaceAll(std::string& str, const std::string& replacement_str); bool isValid() const; }; #endif gource-0.54/src/core/shader.cpp0000644002342600234260000003220614362112041016254 0ustar andrewcandrewc#include "shader.h" /* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #ifndef USE_MGL_NAMESPACE #include "gl.h" #endif #include "logger.h" ShaderManager shadermanager; //ShaderManager ShaderManager::ShaderManager() { } Shader* ShaderManager::grab(const std::string& shader_prefix) { Resource* s = resources[shader_prefix]; if(s==0) { s = new Shader(shader_prefix); resources[shader_prefix] = s; } s->addref(); return (Shader*) s; } void ShaderManager::manage(Shader* shader) { if(shader->resource_name.empty()) { throw ShaderException("Cannot manage shader with no resource name"); } if(resources[shader->resource_name] != 0) { throw ShaderException(str(boost::format("A shader resource already exists under the name '%s'") % shader->resource_name)); } resources[shader->resource_name] = shader; shader->addref(); } void ShaderManager::unload() { for(std::map::iterator it= resources.begin(); it!=resources.end();it++) { ((Shader*)it->second)->unload(); } } void ShaderManager::reload(bool force) { for(std::map::iterator it= resources.begin(); it!=resources.end();it++) { ((Shader*)it->second)->reload(force); } } // ShaderPass ShaderPass::ShaderPass(Shader* parent, int shader_object_type, const std::string& shader_object_desc) : AbstractShaderPass(parent, shader_object_type, shader_object_desc) { } ShaderPass::~ShaderPass() { unload(); } void ShaderPass::unload() { if(shader_object!=0) glDeleteShader(shader_object); shader_object = 0; } void ShaderPass::attachTo(unsigned int program) { glAttachShader(program, shader_object); } void ShaderPass::checkError() { if(!shader_object) return; int compile_success; glGetShaderiv(shader_object, GL_COMPILE_STATUS, &compile_success); int info_log_length; glGetShaderiv(shader_object, GL_INFO_LOG_LENGTH, &info_log_length); const char* resource_desc = !parent->resource_name.empty() ? parent->resource_name.c_str() : "???"; if(info_log_length > 1) { char* info_log = new char[info_log_length]; glGetShaderInfoLog(shader_object, info_log_length, &info_log_length, info_log); std::string info_log_str(info_log); delete [] info_log; std::string context; if(!errorContext(info_log_str, context)) context = shader_object_source; if(!compile_success) { throw ShaderException(str(boost::format("%s shader '%s' failed to compile:\n%s\n%s") % shader_object_desc % resource_desc % info_log_str.c_str() % context), shader_object_source); } if(Logger::getDefault()->getLevel() == LOG_LEVEL_WARN) { warnLog("%s shader '%s':\n%s\n%s", shader_object_desc.c_str(), resource_desc, info_log_str.c_str(), context.c_str()); } return; } if(!compile_success) { throw ShaderException(str(boost::format("%s shader '%s' failed to compile") % shader_object_desc % resource_desc), shader_object_source); } } void ShaderPass::compile() { if(!shader_object) shader_object = glCreateShader(shader_object_type); if(source.empty()) return; shader_object_source.clear(); toString(shader_object_source); // apply subsitutions parent->applySubstitutions(shader_object_source); for(ShaderUniform* u: uniforms) { u->setModified(false); } //fprintf(stderr, "src:\n%s", shader_object_source.c_str()); const char* source_ptr = shader_object_source.c_str(); int source_len = shader_object_source.size(); glShaderSource(shader_object, 1, (const GLchar**) &source_ptr, &source_len); glCompileShader(shader_object); checkError(); } // Shader Shader::Shader(const std::string& prefix) : AbstractShader(prefix) { loadPrefix(); } Shader::Shader() : AbstractShader() { } Shader::~Shader() { clear(); } void Shader::unload() { if(program != 0) glDeleteProgram(program); program = 0; for(std::map::iterator it= uniforms.begin(); it!=uniforms.end();it++) { it->second->unload(); } } void Shader::compile() { if(program !=0) unload(); if(vertex_shader != 0) vertex_shader->compile(); if(geometry_shader != 0) geometry_shader->compile(); if(fragment_shader != 0) fragment_shader->compile(); if(compute_shader != 0) compute_shader->compile(); program = glCreateProgram(); } void Shader::link() { if(vertex_shader!=0) vertex_shader->attachTo(program); if(geometry_shader!=0) geometry_shader->attachTo(program); if(fragment_shader!=0) fragment_shader->attachTo(program); if(compute_shader!=0) compute_shader->attachTo(program); glLinkProgram(program); checkProgramError(); if(vertex_shader != 0) vertex_shader->unload(); if(geometry_shader != 0) geometry_shader->unload(); if(fragment_shader != 0) fragment_shader->unload(); if(compute_shader != 0) compute_shader->unload(); } void Shader::load() { compile(); link(); } void Shader::loadPrefix() { if(vertex_shader != 0) delete vertex_shader; vertex_shader = 0; if(fragment_shader != 0) delete fragment_shader; fragment_shader = 0; std::string shader_dir = shadermanager.getDir(); std::string vertex_file = shader_dir + prefix + std::string(".vert"); std::string fragment_file = shader_dir + prefix + std::string(".frag"); std::string geometry_file = shader_dir + prefix + std::string(".geom"); std::string compute_file = shader_dir + prefix + std::string(".comp"); if(shadermanager.fileExists(vertex_file)) { vertex_shader = new ShaderPass(this, GL_VERTEX_SHADER, "vertex"); vertex_shader->includeFile(vertex_file); } if(shadermanager.fileExists(fragment_file)) { fragment_shader = new ShaderPass(this, GL_FRAGMENT_SHADER, "fragment"); fragment_shader->includeFile(fragment_file); } if(shadermanager.fileExists(geometry_file)) { geometry_shader = new ShaderPass(this, GL_GEOMETRY_SHADER, "geometry"); geometry_shader->includeFile(geometry_file); } if(shadermanager.fileExists(compute_file)) { compute_shader = new ShaderPass(this, GL_COMPUTE_SHADER, "compute"); compute_shader->includeFile(compute_file); } if(!vertex_shader && !compute_shader) { // should have a vertex shader unless there is a compute shader throw ShaderException(str(boost::format("could not find a vertex shader with prefix '%s'") % prefix)); } load(); } void Shader::checkProgramError() { int link_success; glGetProgramiv(program, GL_LINK_STATUS, &link_success); int info_log_length; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_length); const char* resource_desc = !resource_name.empty() ? resource_name.c_str() : "???"; if(info_log_length > 1) { char* info_log = new char[info_log_length]; glGetProgramInfoLog(program, info_log_length, &info_log_length, info_log); if(!link_success) { errorLog("shader '%s' linking error:\n%s", resource_desc, info_log); } else if(Logger::getDefault()->getLevel() == LOG_LEVEL_WARN) { warnLog("shader '%s' warning:\n%s", resource_desc, info_log); } delete [] info_log; } if(!link_success) { throw ShaderException(str(boost::format("shader '%s' failed to link") % resource_desc)); } } void Shader::bind() { glUseProgram(program); } void Shader::unbind() { glUseProgram(0); } int Shader::getUniformLocation(const std::string& uniform_name) { return glGetUniformLocation( program, uniform_name.c_str() ); } void Shader::applyUniform(ShaderUniform* u) { int location = u->getLocation(); if(location == -1) { if(Logger::getDefault()->getLevel() == LOG_LEVEL_PEDANTIC) { pedanticLog("shader '%s': invalid uniform '%s'", (!resource_name.empty() ? resource_name.c_str() : "???"), u->getName().c_str()); } return; } switch(u->getType()) { case SHADER_UNIFORM_INT: glUniform1i(location, ((IntShaderUniform*)u)->getValue()); break; case SHADER_UNIFORM_FLOAT: glUniform1f(location, ((FloatShaderUniform*)u)->getValue()); break; case SHADER_UNIFORM_BOOL: glUniform1i(location, ((BoolShaderUniform*)u)->getValue()); break; case SHADER_UNIFORM_SAMPLER_1D: glUniform1i(location, ((Sampler1DShaderUniform*)u)->getValue()); break; case SHADER_UNIFORM_SAMPLER_2D: glUniform1i(location, ((Sampler2DShaderUniform*)u)->getValue()); break; case SHADER_UNIFORM_SAMPLER_3D: glUniform1i(location, ((Sampler3DShaderUniform*)u)->getValue()); break; case SHADER_UNIFORM_VEC2: glUniform2fv(location, 1, glm::value_ptr(((Vec2ShaderUniform*)u)->getValue())); break; case SHADER_UNIFORM_VEC3: glUniform3fv(location, 1, glm::value_ptr(((Vec3ShaderUniform*)u)->getValue())); break; case SHADER_UNIFORM_VEC4: glUniform4fv(location, 1, glm::value_ptr(((Vec4ShaderUniform*)u)->getValue())); break; case SHADER_UNIFORM_MAT3: glUniformMatrix3fv(location, 1, 0, glm::value_ptr(((Mat3ShaderUniform*)u)->getValue())); break; case SHADER_UNIFORM_MAT4: glUniformMatrix4fv(location, 1, 0, glm::value_ptr(((Mat4ShaderUniform*)u)->getValue())); break; case SHADER_UNIFORM_INT_ARRAY: glUniform1iv(location, ((IntegerArrayShaderUniform*)u)->getLength(), &(((IntegerArrayShaderUniform*)u)->getValue()[0])); break; case SHADER_UNIFORM_FLOAT_ARRAY: glUniform1fv(location, ((FloatArrayShaderUniform*)u)->getLength(), &(((FloatArrayShaderUniform*)u)->getValue()[0])); break; case SHADER_UNIFORM_VEC2_ARRAY: glUniform2fv(location, ((Vec2ArrayShaderUniform*)u)->getLength(), glm::value_ptr(((Vec2ArrayShaderUniform*)u)->getValue()[0])); break; case SHADER_UNIFORM_VEC3_ARRAY: glUniform3fv(location, ((Vec3ArrayShaderUniform*)u)->getLength(), glm::value_ptr(((Vec3ArrayShaderUniform*)u)->getValue()[0])); break; case SHADER_UNIFORM_VEC4_ARRAY: glUniform4fv(location, ((Vec4ArrayShaderUniform*)u)->getLength(), glm::value_ptr(((Vec4ArrayShaderUniform*)u)->getValue()[0])); break; default: throw ShaderException(str(boost::format("unsupported uniform type %d") % u->getType())); break; } } AbstractShaderPass* Shader::grabShaderPass(unsigned int shader_object_type) { AbstractShaderPass* shader_pass = 0; switch(shader_object_type) { case GL_VERTEX_SHADER: if(!vertex_shader) vertex_shader = new ShaderPass(this, GL_VERTEX_SHADER, "vertex"); shader_pass = vertex_shader; break; case GL_GEOMETRY_SHADER: if(!geometry_shader) geometry_shader = new ShaderPass(this, GL_GEOMETRY_SHADER, "geometry"); shader_pass = geometry_shader; break; case GL_FRAGMENT_SHADER: if(!fragment_shader) fragment_shader = new ShaderPass(this, GL_FRAGMENT_SHADER, "fragment"); shader_pass = fragment_shader; break; case GL_COMPUTE_SHADER: if(!compute_shader) compute_shader = new ShaderPass(this, GL_COMPUTE_SHADER, "compute"); shader_pass = compute_shader; break; } return shader_pass; } gource-0.54/src/core/seeklog.cpp0000644002342600234260000001233414362112041016437 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "seeklog.h" #include "sdlapp.h" #ifndef _MSC_VER #include #endif long long gSeekLogMaxBufferSize = 104857600; //StreamLog StreamLog::StreamLog() { this->stream = &std::cin; fcntl_fail = false; #ifdef _WIN32 stdin_handle = GetStdHandle(STD_INPUT_HANDLE); #else int ret = fcntl(STDIN_FILENO, F_GETFL, 0); if (fcntl (STDIN_FILENO, F_SETFL, ret | O_NONBLOCK) < 0) { debugLog("fcntl(stdin) failed"); fcntl_fail = true; } #endif } StreamLog::~StreamLog() { } bool StreamLog::getNextLine(std::string& line) { //try and fix the stream if(isFinished()) stream->clear(); #ifdef _WIN32 DWORD available_bytes; if (!PeekNamedPipe(stdin_handle, 0, 0, 0, &available_bytes, 0)) return false; if(available_bytes==0) return false; #endif std::getline(*stream, line); //remove carriage returns if (line.size() > 0 && line[line.size()-1] == '\r') { line.resize(line.size() - 1); } if(isFinished()) { return false; } return true; } bool StreamLog::isFinished() { if(fcntl_fail || stream->fail() || stream->eof()) { return true; } return false; } // SeekLog SeekLog::SeekLog(std::string logfile) { this->logfile = logfile; this->stream = 0; if(!readFully()) { throw SeekLogException(logfile); } } bool SeekLog::readFully() { if(stream!=0) delete stream; std::ifstream* file = new std::ifstream(logfile.c_str(), std::ios::in | std::ios::binary | std::ios::ate); file_size = file->tellg(); if(!file->is_open()) { delete file; return false; } file->seekg (0, std::ios::beg); //dont load into memory if larger than if(file_size > gSeekLogMaxBufferSize) { stream = file; return true; } //buffer entire file into memory char* filebuffer = new char[file_size+1]; if(!file->read(filebuffer, file_size)) { file->close(); delete file; delete [] filebuffer; return false; } filebuffer[file_size] = '\0'; file->close(); delete file; stream = new std::istringstream(std::string(filebuffer)); delete[] filebuffer; return true; } SeekLog::~SeekLog() { if(stream!=0) delete stream; } float SeekLog::getPercent() { return current_percent; } void SeekLog::setPointer(std::streampos pointer) { stream->clear(); stream->seekg(pointer); } std::streampos SeekLog::getPointer() { return stream->tellg(); } void SeekLog::seekTo(float percent) { std::streampos mem_offset = (std::streampos) (percent * file_size); setPointer(mem_offset); //throw away end of line if(mem_offset != (std::streampos)0) { std::string eol; getNextLine(eol); } } bool SeekLog::getNextLine(std::string& line) { //try and fix the stream if(isFinished()) stream->clear(); std::getline(*stream, line); //remove carriage returns if (line.size() > 0 && line[line.size()-1] == '\r') { line.resize(line.size() - 1); } if(stream->fail()) { return false; } current_percent = (float) stream->tellg() / file_size; //debugLog("current_percent = %.2f\n", current_percent); return true; } // temporarily move the file pointer to get a line somewhere else in the file bool SeekLog::getNextLineAt(std::string& line, float percent) { std::streampos currpointer = getPointer(); seekTo(percent); bool success = getNextLine(line); //set the pointer back setPointer(currpointer); return success; } bool SeekLog::isFinished() { bool finished = false; if(stream->fail() || stream->eof()) { //debugLog("stream is finished"); finished=true; } return finished; } gource-0.54/src/core/vectors.cpp0000644002342600234260000000071414362112041016472 0ustar andrewcandrewc#include "vectors.h" vec2 rotate_vec2(const vec2& v, float s, float c) { return vec2( v.x * c - v.y * s, v.x * s + v.y * c ); } vec2 normalise(const vec2& v) { float l = glm::length(v); if(l > 0.0) return v / l; return v; } vec3 normalise(const vec3& v) { float l = glm::length(v); if(l > 0.0) return v / l; return v; } vec4 normalise(const vec4& v) { float l = glm::length(v); if(l > 0.0) return v / l; return v; } gource-0.54/src/core/stringhash.cpp0000644002342600234260000000466314362112041017166 0ustar andrewcandrewc/* Copyright (c) 2009 Andrew Caudwell (acaudwell@gmail.com) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "stringhash.h" int gStringHashSeed = 31; int stringHash(const std::string& str) { int val = 0; int n = str.size(); for (int i = 0; i < n; i++) { val = val + str[i] * (gStringHashSeed^(n-i)); } if(val<0) { val = -val; } return val; } vec2 vec2Hash(const std::string& str) { int hash = stringHash(str); int x = ((hash/7) % 255) - 127; int y = ((hash/3) % 255) - 127; vec2 v = normalise(vec2(x, y)); return v; } vec3 vec3Hash(const std::string& str) { int hash = stringHash(str); int x = ((hash/7) % 255) - 127; int y = ((hash/3) % 255) - 127; int z = hash % 255; vec3 v = normalise(vec3(x, y, z)); return v; } vec3 colourHash(const std::string& str) { int hash = stringHash(str); if(hash == 0) hash++; int r = (hash/7) % 255; int g = (hash/3) % 255; int b = hash % 255; vec3 colour = normalise(vec3(r, g, b)); return colour; } gource-0.54/src/core/conffile.cpp0000644002342600234260000004706014362112041016577 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "conffile.h" #include "logger.h" #include "regex.h" //section of config file Regex ConfFile_section("^\\s*\\[([^\\]]+)\\]\\s*$"); Regex ConfFile_int_value("^\\s*-?(\\d+)\\s*$"); Regex ConfFile_float_value("^\\s*-?(\\d*\\.?\\d+)\\s*$"); // parse key value pair, seperated by an equals sign, removing white space on key and front of the value Regex ConfFile_key_value("^\\s*([^=\\s]+)\\s*=\\s*([^\\s].*)?$"); // vec2, vec3, or vec4 with liberal allowance for whitespace Regex ConfFile_vec2_value("^\\s*vec2\\(\\s*(-?[0-9.]+)\\s*,\\s*(-?[0-9.]+)\\s*\\)\\s*$"); Regex ConfFile_vec3_value("^\\s*vec3\\(\\s*(-?[0-9.]+)\\s*,\\s*(-?[0-9.]+)\\s*,\\s*(-?[0-9.]+)\\s*\\)\\s*$"); Regex ConfFile_vec4_value("^\\s*vec4\\(\\s*(-?[0-9.]+)\\s*,\\s*(-?[0-9.]+)\\s*,\\s*(-?[0-9.]+)\\s*,\\s*(-?[0-9.]+)\\s*\\)\\s*$"); //ConfEntry ConfEntry::ConfEntry(const std::string& name) { this->name = name; } ConfEntry::ConfEntry(const std::string& name, const std::string& value, int lineno) { this->name = name; this->value = value; this->lineno = lineno; } ConfEntry::ConfEntry(const std::string& name, bool value) { this->name = name; setBool(value); } ConfEntry::ConfEntry(const std::string& name, int value) { this->name = name; setInt(value); } ConfEntry::ConfEntry(const std::string& name, float value) { this->name = name; setFloat(value); } ConfEntry::ConfEntry(const std::string& name, vec2 value) { this->name = name; setVec2(value); } ConfEntry::ConfEntry(const std::string& name, vec3 value) { this->name = name; setVec3(value); } ConfEntry::ConfEntry(const std::string& name, vec4 value) { this->name = name; setVec4(value); } void ConfEntry::setName(const std::string& name) { this->name = name; } void ConfEntry::setString(const std::string& value) { this->value = value; } void ConfEntry::setFloat(float value) { char floattostr[256]; snprintf(floattostr, 256, "%.5f", value); this->value = std::string(floattostr); } void ConfEntry::setInt(int value) { char inttostr[256]; snprintf(inttostr, 256, "%d", value); this->value = std::string(inttostr); } void ConfEntry::setBool(bool value) { this->value = std::string(value ? "yes" : "no"); } void ConfEntry::setVec2(vec2 value) { char vectostr[256]; snprintf(vectostr, 256, "vec2(%.5f, %.5f)", value.x, value.y); this->value = std::string(vectostr); } void ConfEntry::setVec3(vec3 value) { char vectostr[256]; snprintf(vectostr, 256, "vec3(%.5f, %.5f, %.5f)", value.x, value.y, value.z); this->value = std::string(vectostr); } void ConfEntry::setVec4(vec4 value) { char vectostr[256]; snprintf(vectostr, 256, "vec4(%.5f, %.5f, %.5f, %.5f)", value.x, value.y, value.z, value.w); this->value = std::string(vectostr); } std::string ConfEntry::getName() { return name; } std::string ConfEntry::getString() { return value; } int ConfEntry::getLineNumber() { return lineno; } int ConfEntry::getInt() { return atoi(value.c_str()); } bool ConfEntry::isFloat() { if(ConfFile_float_value.match(value)) return true; return false; } bool ConfEntry::isInt() { if(ConfFile_float_value.match(value)) return true; return false; } float ConfEntry::getFloat() { return atof(value.c_str()); } bool ConfEntry::hasValue() { return getString().size() > 0; } bool ConfEntry::isBool() { if( value == "1" || value == "true" || value == "True" || value == "TRUE" || value == "yes" || value == "Yes" || value == "YES" || value == "0" || value == "false" || value == "False" || value == "FALSE" || value == "no" || value == "No" || value == "NO") return true; return false; } bool ConfEntry::getBool() { if(value == "1" || value == "true" || value == "True" || value == "TRUE" || value == "yes" || value == "Yes" || value == "YES") return true; return false; } bool ConfEntry::isVec2() { if(ConfFile_vec2_value.match(value)) return true; return false; } vec2 ConfEntry::getVec2() { std::vector matches; if(ConfFile_vec2_value.match(value, &matches)) { return vec2(atof(matches[0].c_str()), atof(matches[1].c_str())); } return vec2(0.0, 0.0); } bool ConfEntry::isVec3() { if(ConfFile_vec3_value.match(value)) return true; return false; } vec3 ConfEntry::getVec3() { std::vector matches; if(ConfFile_vec3_value.match(value, &matches)) { return vec3(atof(matches[0].c_str()), atof(matches[1].c_str()), atof(matches[2].c_str())); } return vec3(0.0, 0.0, 0.0); } bool ConfEntry::isVec4() { if(ConfFile_vec4_value.match(value)) return true; return false; } vec4 ConfEntry::getVec4() { std::vector matches; if(ConfFile_vec4_value.match(value, &matches)) { return vec4(atof(matches[0].c_str()), atof(matches[1].c_str()), atof(matches[2].c_str()), atof(matches[3].c_str()) ); } return vec4(0.0, 0.0, 0.0, 0.0); } //ConfSection ConfSection::ConfSection() { lineno = 0; conf = 0; } ConfSection::ConfSection(const std::string& name, int lineno) { this->name = name; this->lineno = lineno; this->conf = 0; } ConfSection::~ConfSection() { clear(); } std::string ConfSection::getName() { return name; } ConfFile* ConfSection::getConfFile() { return conf; } void ConfSection::setConfFile(ConfFile* conf) { this->conf = conf; } int ConfSection::getLineNumber() { return lineno; } ConfEntryList* ConfSection::getEntries(const std::string& key) { std::map::iterator entry_finder = entrymap.find(key); if(entry_finder == entrymap.end()) return 0; return entry_finder->second; } ConfEntry* ConfSection::getEntry(const std::string& key) { ConfEntryList* entryList = getEntries(key); if(entryList==0 || entryList->size()==0) return 0; return entryList->front(); } void ConfSection::addEntry(ConfEntry* entry) { ConfEntryList* entrylist = entrymap[entry->getName()]; if(entrylist==0) { entrymap[entry->getName()] = entrylist = new ConfEntryList; } entrylist->push_back(entry); } void ConfSection::addEntry(const std::string& name, const std::string& value, int lineno) { ConfEntry* entry = new ConfEntry(name, value, lineno); addEntry(entry); } //replace first entry with that name void ConfSection::setEntry(ConfEntry* entry) { ConfEntryList* entrylist = entrymap[entry->getName()]; if(entrylist==0) { entrymap[entry->getName()] = entrylist = new ConfEntryList; } //remove any entries with this name while(entrylist->size()>0) { ConfEntry* front = entrylist->front(); entrylist->pop_front(); delete front; } //add new entry entrylist->push_front(entry); } void ConfSection::setEntry(const std::string& name, const std::string& value, int lineno) { ConfEntry* entry = new ConfEntry(name, value, lineno); setEntry(entry); } void ConfSection::clear() { //delete entries for(std::map::iterator it = entrymap.begin(); it!= entrymap.end(); it++) { ConfEntryList* entrylist = it->second; for(std::list::iterator eit = entrylist->begin(); eit != entrylist->end(); eit++) { ConfEntry* e = *eit; delete e; } delete entrylist; } entrymap.clear(); } bool ConfSection::hasValue(const std::string& key) { std::string value = getString(key); if(value.size()>0) return true; return false; } std::string ConfSection::getString(const std::string& key) { ConfEntry* entry = getEntry(key); if(entry==0) return std::string(""); return entry->getString(); } int ConfSection::getInt(const std::string& key) { ConfEntry* entry = getEntry(key); if(entry) return entry->getInt(); return 0; } float ConfSection::getFloat(const std::string& key) { ConfEntry* entry = getEntry(key); if(entry) return entry->getFloat(); return 0.0f; } bool ConfSection::getBool(const std::string& key) { ConfEntry* entry = getEntry(key); if(entry) return entry->getBool(); return false; } vec3 ConfSection::getVec3(const std::string& key) { ConfEntry* entry = getEntry(key); if(entry) return entry->getVec3(); return vec3(0.0, 0.0, 0.0); } vec4 ConfSection::getVec4(const std::string& key) { ConfEntry* entry = getEntry(key); if(entry) return entry->getVec4(); return vec4(0.0, 0.0, 0.0, 0.0); } void ConfSection::print(std::ostream& out) { out << "[" << getName() << "]" << std::endl; for(std::map::iterator it = entrymap.begin(); it!= entrymap.end(); it++) { ConfEntryList* entrylist = it->second; for(std::list::iterator eit = entrylist->begin(); eit != entrylist->end(); eit++) { ConfEntry* e = *eit; out << e->getName() << "=" << e->getString() << std::endl; } } out << std::endl; } //ConfFile ConfFile::ConfFile() { } ConfFile::~ConfFile() { clear(); } void ConfFile::clear() { //delete sections for(std::map::iterator it = sectionmap.begin(); it!= sectionmap.end(); it++) { ConfSectionList* sectionlist = it->second; for(std::list::iterator sit = sectionlist->begin(); sit != sectionlist->end(); sit++) { ConfSection* s = *sit; delete s; } delete sectionlist; } sectionmap.clear(); } void ConfFile::setFilename(const std::string& filename) { this->conffile = filename; } std::string ConfFile::getFilename() { return conffile; } void ConfFile::save(const std::string& conffile) { this->conffile = conffile; save(); } void ConfFile::save() { if(conffile.size()==0) { throw ConfFileException("filename not set", conffile.c_str(), 0); } //save conf file std::ofstream out; out.open(conffile.c_str()); if(!out.is_open()) { std::string write_error = std::string("failed to write config to ") + conffile; throw ConfFileException(write_error, conffile.c_str(), 0); } for(std::map::iterator it = sectionmap.begin(); it!= sectionmap.end(); it++) { ConfSectionList* sectionlist = it->second; for(ConfSectionList::iterator sit = sectionlist->begin(); sit != sectionlist->end(); sit++) { ConfSection* s = *sit; s->print(out); } } out.close(); } void ConfFile::load(const std::string& conffile) { this->conffile = conffile; load(); } static const std::string conffile_whitespaces(" \t\f\v\n\r"); void ConfFile::trim(std::string& value) { if(value.size() == 0) return; size_t string_end = value.find_last_not_of(conffile_whitespaces); if(string_end == std::string::npos) value.assign(""); else if(string_end != value.size()-1) value.assign(value.substr(0,string_end+1)); } void ConfFile::load() { debugLog("ConfFile::load(%s)", conffile.c_str()); clear(); char buff[1024]; int lineno = 0; ConfSection* sec = 0; std::ifstream in(conffile.c_str()); if(!in.is_open()) { snprintf(buff, 1024, "failed to open config file %s", conffile.c_str()); std::string conf_error = std::string(buff); throw ConfFileException(conf_error, conffile, 0); } std::string line; while(std::getline(in, line)) { lineno++; std::vector matches; // blank line or commented out lines if(line.size() == 0 || (line.size() > 0 && line[0] == '#')) { continue; // sections } else if(ConfFile_section.match(line, &matches)) { if(sec != 0) addSection(sec); sec = new ConfSection(matches[0], lineno); // key value pairs } else if(ConfFile_key_value.match(line, &matches)) { std::string key = matches[0]; std::string value = (matches.size()>1) ? matches[1] : ""; //trim whitespace ConfFile::trim(value); if(sec==0) sec = new ConfSection("", lineno); sec->addEntry(key, value, lineno); debugLog("%s: [%s] %s => %s", conffile.c_str(), sec->getName().c_str(), key.c_str(), value.c_str()); } else { snprintf(buff, 1024, "%s, line %d: could not parse line", conffile.c_str(), lineno); std::string conf_error = std::string(buff); throw ConfFileException(conf_error, conffile, lineno); } } if(sec != 0) addSection(sec); in.close(); } bool ConfFile::hasEntry(const std::string& section, const std::string& key) { ConfEntry* entry = getEntry(section, key); if(entry != 0) return true; return false; } bool ConfFile::hasValue(const std::string& section, const std::string& key) { std::string value = getString(section, key); if(value.size()>0) return true; return false; } int ConfFile::countSection(const std::string& section) { ConfSectionList* sectionlist = getSections(section); if(sectionlist==0) return 0; int count = 0; for(ConfSectionList::iterator sit = sectionlist->begin(); sit != sectionlist->end(); sit++) { count++; } return count; } bool ConfFile::hasSection(const std::string& section) { ConfSection* sec = getSection(section); if(sec==0) return false; return true; } ConfSection* ConfFile::addSection(const std::string& section) { ConfSection* sec = new ConfSection(section); addSection(sec); return sec; } void ConfFile::addSection(ConfSection* section) { ConfSectionList* sectionlist = getSections(section->getName()); if(sectionlist==0) { sectionmap[section->getName()] = sectionlist = new ConfSectionList; } section->setConfFile(this); sectionlist->push_back(section); } void ConfFile::setSection(ConfSection* section) { ConfSectionList* sectionlist = getSections(section->getName()); if(sectionlist==0) { sectionmap[section->getName()] = sectionlist = new ConfSectionList; } if(sectionlist->size() != 0) { ConfSection* front = sectionlist->front(); sectionlist->pop_front(); delete front; } sectionlist->push_back(section); } //returns the list of all sections with a particular name ConfSectionList* ConfFile::getSections(const std::string& section) { std::map::iterator section_finder = sectionmap.find(section); if(section_finder == sectionmap.end()) return 0; return section_finder->second; } //returns the first section with a particular name ConfSection* ConfFile::getSection(const std::string& section) { ConfSectionList* sectionlist = getSections(section); if(sectionlist==0 || sectionlist->size()==0) return 0; return sectionlist->front(); } //returns the first section with a particular name void ConfFile::setEntry(const std::string& section, const std::string& key, const std::string& value) { ConfSection* sec = getSection(section); if(sec==0) { sec = addSection(section); } sec->setEntry(key, value); } //returns a list of all entries in a section with a particular name ConfEntryList* ConfFile::getEntries(const std::string& section, const std::string& key) { ConfSection* sec = getSection(section); if(sec==0) return 0; ConfEntryList* entryList = sec->getEntries(key); return entryList; } //get first entry in a section with a particular name ConfEntry* ConfFile::getEntry(const std::string& section, const std::string& key) { ConfSection* sec = getSection(section); if(sec==0) return 0; ConfEntry* entry = sec->getEntry(key); return entry; } std::string ConfFile::getString(const std::string& section, const std::string& key) { ConfEntry* entry = getEntry(section, key); if(entry==0) return std::string(""); return entry->getString(); } int ConfFile::getInt(const std::string& section, const std::string& key) { ConfEntry* entry = getEntry(section, key); if(entry) return entry->getInt(); return 0; } float ConfFile::getFloat(const std::string& section, const std::string& key) { ConfEntry* entry = getEntry(section, key); if(entry) return entry->getFloat(); return 0.0f; } bool ConfFile::getBool(const std::string& section, const std::string& key) { ConfEntry* entry = getEntry(section, key); if(entry) return entry->getBool(); return false; } vec3 ConfFile::getVec3(const std::string& section, const std::string& key) { ConfEntry* entry = getEntry(section, key); if(entry) return entry->getVec3(); return vec3(0.0, 0.0, 0.0); } vec4 ConfFile::getVec4(const std::string& section, const std::string& key) { ConfEntry* entry = getEntry(section, key); if(entry) return entry->getVec4(); return vec4(0.0, 0.0, 0.0, 0.0); } void ConfFile::unknownOptionException(ConfEntry* entry) { std::string reason = "unknown option '"; reason += entry->getName(); reason += std::string("'"); entryException(entry, reason); } void ConfFile::missingValueException(ConfEntry* entry) { std::string reason = std::string("no value specified for '"); reason += entry->getName(); reason += std::string("'"); entryException(entry, reason); } void ConfFile::invalidValueException(ConfEntry* entry) { std::string reason = std::string("invalid '"); reason += entry->getName(); reason += std::string("' value"); entryException(entry, reason); } void ConfFile::missingEntryException(ConfSection* section, std::string entryname) { std::string reason = std::string("section '"); reason += section->getName(); reason += std::string("' missing required entry '"); reason += entryname; reason += std::string("'"); sectionException(section, reason); } void ConfFile::sectionException(ConfSection* section, std::string reason) { std::string errmsg; int lineno = 0; if(conffile.size()) { errmsg = conffile; if(section != 0 && section->getLineNumber() != 0) { lineno = section->getLineNumber(); char linebuff[256]; snprintf(linebuff, 256, ", line %d", lineno); errmsg += std::string(linebuff); } errmsg += std::string(": "); } errmsg += reason; throw ConfFileException(errmsg, conffile, lineno); } void ConfFile::entryException(ConfEntry* entry, std::string reason) { std::string errmsg; int lineno = 0; if(conffile.size()) { errmsg = conffile; if(entry != 0 && entry->getLineNumber() != 0) { lineno = entry->getLineNumber(); char linebuff[256]; snprintf(linebuff, 256, ", line %d", lineno); errmsg += std::string(linebuff); } errmsg += std::string(": "); } errmsg += reason; throw ConfFileException(errmsg, conffile, lineno); } gource-0.54/src/slider.cpp0000644002342600234260000000735014362112041015342 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "slider.h" #include "gource_settings.h" // PositionSlider PositionSlider::PositionSlider(float percent) { this->percent = percent; } void PositionSlider::init() { font = fontmanager.grab(gGourceSettings.font_file, 16 * gGourceSettings.font_scale); font.dropShadow(true); slidercol = vec3(1.0, 1.0, 1.0); mouseover = -1.0; mouseover_elapsed = 1.0; fade_time = 1.0; alpha = 0.0; capwidth = 0.0f; resize(); } const Bounds2D& PositionSlider::getBounds() const { return bounds; } void PositionSlider::resize() { int gap = 35; bounds.reset(); bounds.update(vec2(gap, display.height - gap*2)); bounds.update(vec2(display.width - gap, display.height - gap)); } void PositionSlider::setColour(vec3 col) { slidercol = col; } void PositionSlider::show() { mouseover_elapsed = 0.0; } bool PositionSlider::mouseOver(vec2 pos, float* percent_ptr) { if(bounds.contains(pos)) { mouseover_elapsed = 0; mouseover = pos.x; if(percent_ptr != 0) { *percent_ptr = (float) (pos.x - bounds.min.x) / (bounds.max.x - bounds.min.x); } return true; } mouseover = -1.0; return false; } bool PositionSlider::click(vec2 pos, float* percent_ptr) { if(mouseOver(pos, &percent)) { if(percent_ptr != 0) { *percent_ptr = percent; } return true; } return false; } void PositionSlider::setCaption(const std::string& caption) { capwidth = 0.0; this->caption = caption; if(caption.size()) { capwidth = font.getWidth(caption.c_str()); } } void PositionSlider::setPercent(float percent) { this->percent = percent; } void PositionSlider::logic(float dt) { if(mouseover < 0.0 && mouseover_elapsed < fade_time) mouseover_elapsed += dt; if(mouseover_elapsed < fade_time && alpha < 1.0) { alpha = std::min(1.0f, alpha+dt); } else if(mouseover_elapsed >= fade_time && alpha > 0.0) { alpha = std::max(0.0f, alpha-dt); } } void PositionSlider::drawSlider(float pos_x) const { glLineWidth(2.0f); bounds.draw(); glLineWidth(2.0f); glBegin(GL_LINES); glVertex2f(pos_x, bounds.min.y); glVertex2f(pos_x, bounds.max.y); glEnd(); } void PositionSlider::draw(float dt) { glDisable(GL_TEXTURE_2D); float pos_x = bounds.min.x + (bounds.max.x - bounds.min.x) * percent; glColor4f(0.0f, 0.0f, 0.0f, 0.7*alpha); glPushMatrix(); glTranslatef(2.0, 2.0, 0.0); drawSlider(pos_x); glPopMatrix(); glColor4f(slidercol.x, slidercol.y, slidercol.z, alpha); drawSlider(pos_x); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glColor4f(1.0, 1.0, 1.0, 1.0); if(caption.size() && mouseover >= 0.0) { int height_offset = 25 * gGourceSettings.font_scale; font.draw(std::min((double)display.width - capwidth - 1.0, std::max(1.0, mouseover - (capwidth/2.0))), bounds.min.y - height_offset, caption); } } gource-0.54/src/gource_shell.cpp0000644002342600234260000001661414362112041016536 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "gource_shell.h" GourceShell* gGourceShell = 0; // GourceShell GourceShell::GourceShell(ConfFile* conf, FrameExporter* exporter) { this->conf = conf; this->exporter = exporter; min_delta_msec = 16; next = false; gource = 0; gource_settings = conf->getSections("gource")->begin(); gGourceSettings.repo_count = conf->countSection("gource"); toggle_delay = 0.0; transition_texture = 0; transition_interval = 0.0f; if(GLEW_ARB_texture_non_power_of_two || GLEW_VERSION_2_0) { transition_texture = texturemanager.create(display.width, display.height, false, GL_CLAMP_TO_EDGE, GL_RGBA); } } GourceShell::~GourceShell() { if(gource!=0) delete gource; if(transition_texture!=0) texturemanager.release(transition_texture); } void GourceShell::toggleFullscreen() { if(exporter != 0) return; texturemanager.unload(); shadermanager.unload(); fontmanager.unload(); if(gource!=0) gource->unload(); //recreate gl context display.toggleFullscreen(); texturemanager.reload(); shadermanager.reload(); fontmanager.reload(); if(gource!=0) gource->reload(); } void GourceShell::toggleWindowFrame() { #if SDL_VERSION_ATLEAST(2,0,0) if(toggle_delay > 0.0) return; if(display.isFullscreen()) return; if(exporter != 0) return; texturemanager.unload(); shadermanager.unload(); fontmanager.unload(); if(gource!=0) gource->unload(); display.toggleFrameless(); texturemanager.reload(); shadermanager.reload(); fontmanager.reload(); if(gource!=0) gource->reload(); toggle_delay = 0.25f; #endif } void GourceShell::resize(int width, int height) { texturemanager.unload(); shadermanager.unload(); fontmanager.unload(); if(gource!=0) gource->unload(); //recreate gl context display.resize(width, height); texturemanager.reload(); shadermanager.reload(); fontmanager.reload(); if(gource!=0) gource->reload(); } void GourceShell::reload() { texturemanager.unload(); shadermanager.unload(); fontmanager.unload(); if(gource!=0) gource->unload(); texturemanager.reload(); shadermanager.reload(true); fontmanager.reload(); if(gource!=0) gource->reload(); } void GourceShell::keyPress(SDL_KeyboardEvent *e) { bool repeat = false; #if SDL_VERSION_ATLEAST(2,0,0) repeat = (e->repeat > 0); #endif //Quit demo if the user presses ESC if (e->type == SDL_KEYDOWN && !repeat) { #if SDL_VERSION_ATLEAST(2,0,0) bool key_escape = e->keysym.sym == SDLK_ESCAPE; bool key_return = e->keysym.sym == SDLK_RETURN; #else bool key_escape = e->keysym.unicode == SDLK_ESCAPE; bool key_return = e->keysym.unicode == SDLK_RETURN; #endif if (key_escape) { quit(); } if(gGourceSettings.disable_input) { // disable keyboard input other than the escape key return; } if (e->keysym.sym == SDLK_F5) { reload(); } if (e->keysym.sym == SDLK_F11) { toggleWindowFrame(); } if(key_return) { #if SDL_VERSION_ATLEAST(2,0,0) const Uint8* keystate = SDL_GetKeyboardState(NULL); if(keystate[SDL_SCANCODE_RALT] || keystate[SDL_SCANCODE_LALT]) { #else Uint8* keystate = SDL_GetKeyState(NULL); if(keystate[SDLK_RALT] || keystate[SDLK_LALT]) { #endif toggleFullscreen(); } else { if(gGourceSettings.repo_count>1) next = true; } } } if(gource!=0) gource->keyPress(e); } void GourceShell::mouseMove(SDL_MouseMotionEvent *e) { if(gource!=0) gource->mouseMove(e); } #if SDL_VERSION_ATLEAST(2,0,0) void GourceShell::mouseWheel(SDL_MouseWheelEvent *e) { if(gource!=0) gource->mouseWheel(e); } #endif void GourceShell::mouseClick(SDL_MouseButtonEvent *e) { if(gource!=0) gource->mouseClick(e); } void GourceShell::quit() { if(gource!=0) gource->quit(); gGourceSettings.shutdown=true; } Gource* GourceShell::getNext() { if(gource != 0) { transition_interval = 1.0f; delete gource; gource = 0; } if(gGourceSettings.shutdown || gource_settings == conf->getSections("gource")->end()) { // done return 0; } gGourceSettings.importGourceSettings(*conf, *gource_settings); //recording a video kind of implies you want this, unless: // -- dont stop requested // -- loop requested // -- reading from STDIN if(exporter!=0 && !(gGourceSettings.dont_stop || gGourceSettings.loop || gGourceSettings.path == "-")) gGourceSettings.stop_at_end = true; //multiple repo special settings if(gGourceSettings.repo_count > 1) { //set a stop condition if(gGourceSettings.stop_at_time <= 0.0f && gGourceSettings.stop_position <= 0.0f) { gGourceSettings.stop_at_time = 60.0f; } } gource_settings++; //loop unless only 1 repo if(gource_settings == conf->getSections("gource")->end()) { if(gGourceSettings.repo_count>1 && exporter==0) { gource_settings = conf->getSections("gource")->begin(); } } // replace gource gource = new Gource(exporter); next = false; return gource; } void GourceShell::blendLastFrame(float dt) { if(transition_texture==0 || transition_interval <= 0.0f) return; display.mode2D(); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); transition_texture->bind(); glColor4f(1.0, 1.0, 1.0, transition_interval); glBegin(GL_QUADS); glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 0.0); glTexCoord2f(1.0, 1.0f); glVertex2f(display.width, 0.0); glTexCoord2f(1.0, 0.0f); glVertex2f(display.width, display.height); glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, display.height); glEnd(); transition_interval -= dt; } void GourceShell::update(float t, float dt) { if(gource == 0 || gource->isFinished()) { if(!getNext()) appFinished=true; return; } gource->fps = this->fps; gource->update(t, dt); if(toggle_delay > 0.0) toggle_delay -= dt; //copy last frame if( (next|| gource->isFinished()) && transition_texture!=0) { glEnable(GL_TEXTURE_2D); transition_texture->bind(); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, display.width, display.height, 0); } else { //blend last frame of previous scene blendLastFrame(dt); } if(next) { delete gource; gource = 0; transition_interval = 1.0f; next = false; } } gource-0.54/src/main.h0000644002342600234260000000146414362112041014451 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef GOURCE_MAIN_H #define GOURCE_MAIN_H #include "gource_shell.h" #include "gource.h" #endif gource-0.54/src/logmill.h0000644002342600234260000000313614362112041015162 0ustar andrewcandrewc/* Copyright (C) 2012 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef LOGMILL_H #define LOGMILL_H #include #include "SDL_thread.h" #include "core/sdlapp.h" #include "core/display.h" #include "formats/commitlog.h" #if defined(HAVE_PTHREAD) && !defined(_WIN32) #include #endif enum { LOGMILL_STATE_STARTUP, LOGMILL_STATE_FETCHING, LOGMILL_STATE_SUCCESS, LOGMILL_STATE_FAILURE }; class RLogMill { SDL_Thread* thread; SDL_mutex* mutex; SDL_cond* cond; int logmill_thread_state; std::string logfile; RCommitLog* clog; std::string error; bool findRepository(boost::filesystem::path& dir, std::string& log_format); RCommitLog* fetchLog(std::string& log_format); public: RLogMill(const std::string& logfile); ~RLogMill(); void run(); void abort(); std::string getError(); int getStatus(); bool isFinished(); RCommitLog* getLog(); }; #endif gource-0.54/src/tinyxml/0000755002342600234260000000000014362112042015054 5ustar andrewcandrewcgource-0.54/src/tinyxml/tinystr.cpp0000644002342600234260000000471314362112041017300 0ustar andrewcandrewc/* www.sourceforge.net/projects/tinyxml This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef TIXML_USE_STL #include "tinystr.h" // Error value for find primitive const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1); // Null rep. TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } }; void TiXmlString::reserve (size_type cap) { if (cap > capacity()) { TiXmlString tmp; tmp.init(length(), cap); memcpy(tmp.start(), data(), length()); swap(tmp); } } TiXmlString& TiXmlString::assign(const char* str, size_type len) { size_type cap = capacity(); if (len > cap || cap > 3*(len + 8)) { TiXmlString tmp; tmp.init(len); memcpy(tmp.start(), str, len); swap(tmp); } else { memmove(start(), str, len); set_size(len); } return *this; } TiXmlString& TiXmlString::append(const char* str, size_type len) { size_type newsize = length() + len; if (newsize > capacity()) { reserve (newsize + capacity()); } memmove(finish(), str, len); set_size(newsize); return *this; } TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) { TiXmlString tmp; tmp.reserve(a.length() + b.length()); tmp += a; tmp += b; return tmp; } TiXmlString operator + (const TiXmlString & a, const char* b) { TiXmlString tmp; TiXmlString::size_type b_len = static_cast( strlen(b) ); tmp.reserve(a.length() + b_len); tmp += a; tmp.append(b, b_len); return tmp; } TiXmlString operator + (const char* a, const TiXmlString & b) { TiXmlString tmp; TiXmlString::size_type a_len = static_cast( strlen(a) ); tmp.reserve(a_len + b.length()); tmp.append(a, a_len); tmp += b; return tmp; } #endif // TIXML_USE_STL gource-0.54/src/tinyxml/tinyxmlparser.cpp0000644002342600234260000011057214362112041020506 0ustar andrewcandrewc/* www.sourceforge.net/projects/tinyxml Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include #include #include "tinyxml.h" //#define DEBUG_PARSER #if defined( DEBUG_PARSER ) # if defined( DEBUG ) && defined( _MSC_VER ) # include # define TIXML_LOG OutputDebugString # else # define TIXML_LOG printf # endif #endif // Note tha "PutString" hardcodes the same list. This // is less flexible than it appears. Changing the entries // or order will break putstring. TiXmlBase::Entity TiXmlBase::entity[ TiXmlBase::NUM_ENTITY ] = { { "&", 5, '&' }, { "<", 4, '<' }, { ">", 4, '>' }, { """, 6, '\"' }, { "'", 6, '\'' } }; // Bunch of unicode info at: // http://www.unicode.org/faq/utf_bom.html // Including the basic of this table, which determines the #bytes in the // sequence from the lead byte. 1 placed for invalid sequences -- // although the result will be junk, pass it through as much as possible. // Beware of the non-characters in UTF-8: // ef bb bf (Microsoft "lead bytes") // ef bf be // ef bf bf const unsigned char TIXML_UTF_LEAD_0 = 0xefU; const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; const int TiXmlBase::utf8ByteTable[256] = { // 0 1 2 3 4 5 6 7 8 9 a b c d e f 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid }; void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) { const unsigned long BYTE_MASK = 0xBF; const unsigned long BYTE_MARK = 0x80; const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; if (input < 0x80) *length = 1; else if ( input < 0x800 ) *length = 2; else if ( input < 0x10000 ) *length = 3; else if ( input < 0x200000 ) *length = 4; else { *length = 0; return; } // This code won't covert this correctly anyway. output += *length; // Scary scary fall throughs. switch (*length) { case 4: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 3: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 2: --output; *output = (char)((input | BYTE_MARK) & BYTE_MASK); input >>= 6; case 1: --output; *output = (char)(input | FIRST_BYTE_MARK[*length]); } } /*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) { // This will only work for low-ascii, everything else is assumed to be a valid // letter. I'm not sure this is the best approach, but it is quite tricky trying // to figure out alhabetical vs. not across encoding. So take a very // conservative approach. // if ( encoding == TIXML_ENCODING_UTF8 ) // { if ( anyByte < 127 ) return isalpha( anyByte ); else return 1; // What else to do? The unicode set is huge...get the english ones right. // } // else // { // return isalpha( anyByte ); // } } /*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) { // This will only work for low-ascii, everything else is assumed to be a valid // letter. I'm not sure this is the best approach, but it is quite tricky trying // to figure out alhabetical vs. not across encoding. So take a very // conservative approach. // if ( encoding == TIXML_ENCODING_UTF8 ) // { if ( anyByte < 127 ) return isalnum( anyByte ); else return 1; // What else to do? The unicode set is huge...get the english ones right. // } // else // { // return isalnum( anyByte ); // } } class TiXmlParsingData { friend class TiXmlDocument; public: void Stamp( const char* now, TiXmlEncoding encoding ); const TiXmlCursor& Cursor() const { return cursor; } private: // Only used by the document! TiXmlParsingData( const char* start, int _tabsize, int row, int col ) { assert( start ); stamp = start; tabsize = _tabsize; cursor.row = row; cursor.col = col; } TiXmlCursor cursor; const char* stamp; int tabsize; }; void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) { assert( now ); // Do nothing if the tabsize is 0. if ( tabsize < 1 ) { return; } // Get the current row, column. int row = cursor.row; int col = cursor.col; const char* p = stamp; assert( p ); while ( p < now ) { // Treat p as unsigned, so we have a happy compiler. const unsigned char* pU = (const unsigned char*)p; // Code contributed by Fletcher Dunn: (modified by lee) switch (*pU) { case 0: // We *should* never get here, but in case we do, don't // advance past the terminating null character, ever return; case '\r': // bump down to the next line ++row; col = 0; // Eat the character ++p; // Check for \r\n sequence, and treat this as a single character if (*p == '\n') { ++p; } break; case '\n': // bump down to the next line ++row; col = 0; // Eat the character ++p; // Check for \n\r sequence, and treat this as a single // character. (Yes, this bizarre thing does occur still // on some arcane platforms...) if (*p == '\r') { ++p; } break; case '\t': // Eat the character ++p; // Skip to next tab stop col = (col / tabsize + 1) * tabsize; break; case TIXML_UTF_LEAD_0: if ( encoding == TIXML_ENCODING_UTF8 ) { if ( *(p+1) && *(p+2) ) { // In these cases, don't advance the column. These are // 0-width spaces. if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) p += 3; else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) p += 3; else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) p += 3; else { p +=3; ++col; } // A normal character. } } else { ++p; ++col; } break; default: if ( encoding == TIXML_ENCODING_UTF8 ) { // Eat the 1 to 4 byte utf8 character. int step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)]; if ( step == 0 ) step = 1; // Error case from bad encoding, but handle gracefully. p += step; // Just advance one column, of course. ++col; } else { ++p; ++col; } break; } } cursor.row = row; cursor.col = col; assert( cursor.row >= -1 ); assert( cursor.col >= -1 ); stamp = p; assert( stamp ); } const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) { if ( !p || !*p ) { return 0; } if ( encoding == TIXML_ENCODING_UTF8 ) { while ( *p ) { const unsigned char* pU = (const unsigned char*)p; // Skip the stupid Microsoft UTF-8 Byte order marks if ( *(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) { p += 3; continue; } else if(*(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==0xbfU && *(pU+2)==0xbeU ) { p += 3; continue; } else if(*(pU+0)==TIXML_UTF_LEAD_0 && *(pU+1)==0xbfU && *(pU+2)==0xbfU ) { p += 3; continue; } if ( IsWhiteSpace( *p ) ) // Still using old rules for white space. ++p; else break; } } else { while ( *p && IsWhiteSpace( *p ) ) ++p; } return p; } #ifdef TIXML_USE_STL /*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ) { for( ;; ) { if ( !in->good() ) return false; int c = in->peek(); // At this scope, we can't get to a document. So fail silently. if ( !IsWhiteSpace( c ) || c <= 0 ) return true; *tag += (char) in->get(); } } /*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag ) { //assert( character > 0 && character < 128 ); // else it won't work in utf-8 while ( in->good() ) { int c = in->peek(); if ( c == character ) return true; if ( c <= 0 ) // Silent failure: can't get document at this scope return false; in->get(); *tag += (char) c; } return false; } #endif // One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The // "assign" optimization removes over 10% of the execution time. // const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) { // Oddly, not supported on some comilers, //name->clear(); // So use this: *name = ""; assert( p ); // Names start with letters or underscores. // Of course, in unicode, tinyxml has no idea what a letter *is*. The // algorithm is generous. // // After that, they can be letters, underscores, numbers, // hyphens, or colons. (Colons are valid ony for namespaces, // but tinyxml can't tell namespaces from names.) if ( p && *p && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) { const char* start = p; while( p && *p && ( IsAlphaNum( (unsigned char ) *p, encoding ) || *p == '_' || *p == '-' || *p == '.' || *p == ':' ) ) { //(*name) += *p; // expensive ++p; } if ( p-start > 0 ) { name->assign( start, p-start ); } return p; } return 0; } const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) { // Presume an entity, and pull it out. TIXML_STRING ent; int i; *length = 0; if ( *(p+1) && *(p+1) == '#' && *(p+2) ) { unsigned long ucs = 0; ptrdiff_t delta = 0; unsigned mult = 1; if ( *(p+2) == 'x' ) { // Hexadecimal. if ( !*(p+3) ) return 0; const char* q = p+3; q = strchr( q, ';' ); if ( !q || !*q ) return 0; delta = q-p; --q; while ( *q != 'x' ) { if ( *q >= '0' && *q <= '9' ) ucs += mult * (*q - '0'); else if ( *q >= 'a' && *q <= 'f' ) ucs += mult * (*q - 'a' + 10); else if ( *q >= 'A' && *q <= 'F' ) ucs += mult * (*q - 'A' + 10 ); else return 0; mult *= 16; --q; } } else { // Decimal. if ( !*(p+2) ) return 0; const char* q = p+2; q = strchr( q, ';' ); if ( !q || !*q ) return 0; delta = q-p; --q; while ( *q != '#' ) { if ( *q >= '0' && *q <= '9' ) ucs += mult * (*q - '0'); else return 0; mult *= 10; --q; } } if ( encoding == TIXML_ENCODING_UTF8 ) { // convert the UCS to UTF-8 ConvertUTF32ToUTF8( ucs, value, length ); } else { *value = (char)ucs; *length = 1; } return p + delta + 1; } // Now try to match it. for( i=0; iappend( cArr, len ); } } else { bool whitespace = false; // Remove leading white space: p = SkipWhiteSpace( p, encoding ); while ( p && *p && !StringEqual( p, endTag, caseInsensitive, encoding ) ) { if ( *p == '\r' || *p == '\n' ) { whitespace = true; ++p; } else if ( IsWhiteSpace( *p ) ) { whitespace = true; ++p; } else { // If we've found whitespace, add it before the // new character. Any whitespace just becomes a space. if ( whitespace ) { (*text) += ' '; whitespace = false; } int len; char cArr[4] = { 0, 0, 0, 0 }; p = GetChar( p, cArr, &len, encoding ); if ( len == 1 ) (*text) += cArr[0]; // more efficient else text->append( cArr, len ); } } } if ( p && *p ) p += strlen( endTag ); return ( p && *p ) ? p : 0; } #ifdef TIXML_USE_STL void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag ) { // The basic issue with a document is that we don't know what we're // streaming. Read something presumed to be a tag (and hope), then // identify it, and call the appropriate stream method on the tag. // // This "pre-streaming" will never read the closing ">" so the // sub-tag can orient itself. if ( !StreamTo( in, '<', tag ) ) { SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } while ( in->good() ) { int tagIndex = (int) tag->length(); while ( in->good() && in->peek() != '>' ) { int c = in->get(); if ( c <= 0 ) { SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); break; } (*tag) += (char) c; } if ( in->good() ) { // We now have something we presume to be a node of // some sort. Identify it, and call the node to // continue streaming. TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); if ( node ) { node->StreamIn( in, tag ); bool isElement = node->ToElement() != 0; delete node; node = 0; // If this is the root element, we're done. Parsing will be // done by the >> operator. if ( isElement ) { return; } } else { SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } } } // We should have returned sooner. SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); } #endif const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) { ClearError(); // Parse away, at the document level. Since a document // contains nothing but other tags, most of what happens // here is skipping white space. if ( !p || !*p ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } // Note that, for a document, this needs to come // before the while space skip, so that parsing // starts from the pointer we are given. location.Clear(); if ( prevData ) { location.row = prevData->cursor.row; location.col = prevData->cursor.col; } else { location.row = 0; location.col = 0; } TiXmlParsingData data( p, TabSize(), location.row, location.col ); location = data.Cursor(); if ( encoding == TIXML_ENCODING_UNKNOWN ) { // Check for the Microsoft UTF-8 lead bytes. const unsigned char* pU = (const unsigned char*)p; if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) { encoding = TIXML_ENCODING_UTF8; useMicrosoftBOM = true; } } p = SkipWhiteSpace( p, encoding ); if ( !p ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } while ( p && *p ) { TiXmlNode* node = Identify( p, encoding ); if ( node ) { p = node->Parse( p, &data, encoding ); LinkEndChild( node ); } else { break; } // Did we get encoding info? if ( encoding == TIXML_ENCODING_UNKNOWN && node->ToDeclaration() ) { TiXmlDeclaration* dec = node->ToDeclaration(); const char* enc = dec->Encoding(); assert( enc ); if ( *enc == 0 ) encoding = TIXML_ENCODING_UTF8; else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) encoding = TIXML_ENCODING_UTF8; else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice else encoding = TIXML_ENCODING_LEGACY; } p = SkipWhiteSpace( p, encoding ); } // Was this empty? if ( !firstChild ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); return 0; } // All is well. return p; } void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) { // The first error in a chain is more accurate - don't set again! if ( error ) return; assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); error = true; errorId = err; errorDesc = errorString[ errorId ]; errorLocation.Clear(); if ( pError && data ) { data->Stamp( pError, encoding ); errorLocation = data->Cursor(); } } TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) { TiXmlNode* returnNode = 0; p = SkipWhiteSpace( p, encoding ); if( !p || !*p || *p != '<' ) { return 0; } p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) { return 0; } // What is this thing? // - Elements start with a letter or underscore, but xml is reserved. // - Comments: "; if ( !StringEqual( p, startTag, false, encoding ) ) { if ( document ) document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); return 0; } p += strlen( startTag ); // [ 1475201 ] TinyXML parses entities in comments // Oops - ReadText doesn't work, because we don't want to parse the entities. // p = ReadText( p, &value, false, endTag, false, encoding ); // // from the XML spec: /* [Definition: Comments may appear anywhere in a document outside other markup; in addition, they may appear within the document type declaration at places allowed by the grammar. They are not part of the document's character data; an XML processor MAY, but need not, make it possible for an application to retrieve the text of comments. For compatibility, the string "--" (double-hyphen) MUST NOT occur within comments.] Parameter entity references MUST NOT be recognized within comments. An example of a comment: */ value = ""; // Keep all the white space. while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) { value.append( p, 1 ); ++p; } if ( p && *p ) p += strlen( endTag ); return p; } const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) return 0; if ( data ) { data->Stamp( p, encoding ); location = data->Cursor(); } // Read the name, the '=' and the value. const char* pErr = p; p = ReadName( p, &name, encoding ); if ( !p || !*p ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); return 0; } p = SkipWhiteSpace( p, encoding ); if ( !p || !*p || *p != '=' ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } ++p; // skip '=' p = SkipWhiteSpace( p, encoding ); if ( !p || !*p ) { if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } const char* end; const char SINGLE_QUOTE = '\''; const char DOUBLE_QUOTE = '\"'; if ( *p == SINGLE_QUOTE ) { ++p; end = "\'"; // single quote in string p = ReadText( p, &value, false, end, false, encoding ); } else if ( *p == DOUBLE_QUOTE ) { ++p; end = "\""; // double quote in string p = ReadText( p, &value, false, end, false, encoding ); } else { // All attribute values should be in single or double quotes. // But this is such a common error that the parser will try // its best, even without them. value = ""; while ( p && *p // existence && !IsWhiteSpace( *p ) // whitespace && *p != '/' && *p != '>' ) // tag end { if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) { // [ 1451649 ] Attribute values with trailing quotes not handled correctly // We did not have an opening quote but seem to have a // closing one. Give up and throw an error. if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); return 0; } value += *p; ++p; } } return p; } #ifdef TIXML_USE_STL void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag ) { while ( in->good() ) { int c = in->peek(); if ( !cdata && (c == '<' ) ) { return; } if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; in->get(); // "commits" the peek made above if ( cdata && c == '>' && tag->size() >= 3 ) { size_t len = tag->size(); if ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) { // terminator of cdata. return; } } } } #endif const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) { value = ""; TiXmlDocument* document = GetDocument(); if ( data ) { data->Stamp( p, encoding ); location = data->Cursor(); } const char* const startTag = ""; if ( cdata || StringEqual( p, startTag, false, encoding ) ) { cdata = true; if ( !StringEqual( p, startTag, false, encoding ) ) { if ( document ) document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); return 0; } p += strlen( startTag ); // Keep all the white space, ignore the encoding, etc. while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) { value += *p; ++p; } TIXML_STRING dummy; p = ReadText( p, &dummy, false, endTag, false, encoding ); return p; } else { bool ignoreWhite = true; const char* end = "<"; p = ReadText( p, &value, ignoreWhite, end, false, encoding ); if ( p && *p ) return p-1; // don't truncate the '<' return 0; } } #ifdef TIXML_USE_STL void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag ) { while ( in->good() ) { int c = in->get(); if ( c <= 0 ) { TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); return; } (*tag) += (char) c; if ( c == '>' ) { // All is well. return; } } } #endif const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) { p = SkipWhiteSpace( p, _encoding ); // Find the beginning, find the end, and look for // the stuff in-between. TiXmlDocument* document = GetDocument(); if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); return 0; } if ( data ) { data->Stamp( p, _encoding ); location = data->Cursor(); } p += 5; version = ""; encoding = ""; standalone = ""; while ( p && *p ) { if ( *p == '>' ) { ++p; return p; } p = SkipWhiteSpace( p, _encoding ); if ( StringEqual( p, "version", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); version = attrib.Value(); } else if ( StringEqual( p, "encoding", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); encoding = attrib.Value(); } else if ( StringEqual( p, "standalone", true, _encoding ) ) { TiXmlAttribute attrib; p = attrib.Parse( p, data, _encoding ); standalone = attrib.Value(); } else { // Read over whatever it is. while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) ++p; } } return 0; } bool TiXmlText::Blank() const { for ( unsigned i=0; i #include /* The support for explicit isn't that universal, and it isn't really required - it is used to check that the TiXmlString class isn't incorrectly used. Be nice to old compilers and macro it here: */ #if defined(_MSC_VER) && (_MSC_VER >= 1200 ) // Microsoft visual studio, version 6 and higher. #define TIXML_EXPLICIT explicit #elif defined(__GNUC__) && (__GNUC__ >= 3 ) // GCC version 3 and higher.s #define TIXML_EXPLICIT explicit #else #define TIXML_EXPLICIT #endif /* TiXmlString is an emulation of a subset of the std::string template. Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. Only the member functions relevant to the TinyXML project have been implemented. The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase a string and there's no more room, we allocate a buffer twice as big as we need. */ class TiXmlString { public : // The size type used typedef size_t size_type; // Error value for find primitive static const size_type npos; // = -1; // TiXmlString empty constructor TiXmlString () : rep_(&nullrep_) { } // TiXmlString copy constructor TiXmlString ( const TiXmlString & copy) : rep_(0) { init(copy.length()); memcpy(start(), copy.data(), length()); } // TiXmlString constructor, based on a string TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) { init( static_cast( strlen(copy) )); memcpy(start(), copy, length()); } // TiXmlString constructor, based on a string TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) { init(len); memcpy(start(), str, len); } // TiXmlString destructor ~TiXmlString () { quit(); } TiXmlString& operator = (const char * copy) { return assign( copy, (size_type)strlen(copy)); } TiXmlString& operator = (const TiXmlString & copy) { return assign(copy.start(), copy.length()); } // += operator. Maps to append TiXmlString& operator += (const char * suffix) { return append(suffix, static_cast( strlen(suffix) )); } // += operator. Maps to append TiXmlString& operator += (char single) { return append(&single, 1); } // += operator. Maps to append TiXmlString& operator += (const TiXmlString & suffix) { return append(suffix.data(), suffix.length()); } // Convert a TiXmlString into a null-terminated char * const char * c_str () const { return rep_->str; } // Convert a TiXmlString into a char * (need not be null terminated). const char * data () const { return rep_->str; } // Return the length of a TiXmlString size_type length () const { return rep_->size; } // Alias for length() size_type size () const { return rep_->size; } // Checks if a TiXmlString is empty bool empty () const { return rep_->size == 0; } // Return capacity of string size_type capacity () const { return rep_->capacity; } // single char extraction const char& at (size_type index) const { assert( index < length() ); return rep_->str[ index ]; } // [] operator char& operator [] (size_type index) const { assert( index < length() ); return rep_->str[ index ]; } // find a char in a string. Return TiXmlString::npos if not found size_type find (char lookup) const { return find(lookup, 0); } // find a char in a string from an offset. Return TiXmlString::npos if not found size_type find (char tofind, size_type offset) const { if (offset >= length()) return npos; for (const char* p = c_str() + offset; *p != '\0'; ++p) { if (*p == tofind) return static_cast< size_type >( p - c_str() ); } return npos; } void clear () { //Lee: //The original was just too strange, though correct: // TiXmlString().swap(*this); //Instead use the quit & re-init: quit(); init(0,0); } /* Function to reserve a big amount of data when we know we'll need it. Be aware that this function DOES NOT clear the content of the TiXmlString if any exists. */ void reserve (size_type cap); TiXmlString& assign (const char* str, size_type len); TiXmlString& append (const char* str, size_type len); void swap (TiXmlString& other) { Rep* r = rep_; rep_ = other.rep_; other.rep_ = r; } private: void init(size_type sz) { init(sz, sz); } void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } char* start() const { return rep_->str; } char* finish() const { return rep_->str + rep_->size; } struct Rep { size_type size, capacity; char str[1]; }; void init(size_type sz, size_type cap) { if (cap) { // Lee: the original form: // rep_ = static_cast(operator new(sizeof(Rep) + cap)); // doesn't work in some cases of new being overloaded. Switching // to the normal allocation, although use an 'int' for systems // that are overly picky about structure alignment. const size_type bytesNeeded = sizeof(Rep) + cap; const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); rep_ = reinterpret_cast( new int[ intsNeeded ] ); rep_->str[ rep_->size = sz ] = '\0'; rep_->capacity = cap; } else { rep_ = &nullrep_; } } void quit() { if (rep_ != &nullrep_) { // The rep_ is really an array of ints. (see the allocator, above). // Cast it back before delete, so the compiler won't incorrectly call destructors. delete [] ( reinterpret_cast( rep_ ) ); } } Rep * rep_; static Rep nullrep_; } ; inline bool operator == (const TiXmlString & a, const TiXmlString & b) { return ( a.length() == b.length() ) // optimization on some platforms && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare } inline bool operator < (const TiXmlString & a, const TiXmlString & b) { return strcmp(a.c_str(), b.c_str()) < 0; } inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); TiXmlString operator + (const TiXmlString & a, const char* b); TiXmlString operator + (const char* a, const TiXmlString & b); /* TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. Only the operators that we need for TinyXML have been developped. */ class TiXmlOutStream : public TiXmlString { public : // TiXmlOutStream << operator. TiXmlOutStream & operator << (const TiXmlString & in) { *this += in; return *this; } // TiXmlOutStream << operator. TiXmlOutStream & operator << (const char * in) { *this += in; return *this; } } ; #endif // TIXML_STRING_INCLUDED #endif // TIXML_USE_STL gource-0.54/src/tinyxml/tinyxmlerror.cpp0000644002342600234260000000337714362112042020350 0ustar andrewcandrewc/* www.sourceforge.net/projects/tinyxml Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include "tinyxml.h" // The goal of the seperate error file is to make the first // step towards localization. tinyxml (currently) only supports // english error messages, but the could now be translated. // // It also cleans up the code a bit. // const char* TiXmlBase::errorString[ TiXmlBase::TIXML_ERROR_STRING_COUNT ] = { "No error", "Error", "Failed to open file", "Error parsing Element.", "Failed to read Element name", "Error reading Element value.", "Error reading Attributes.", "Error: empty tag.", "Error reading end tag.", "Error parsing Unknown.", "Error parsing Comment.", "Error parsing Declaration.", "Error document empty.", "Error null (0) or unexpected EOF found in input stream.", "Error parsing CDATA.", "Error when TiXmlDocument added to document, because TiXmlDocument can only be at the root.", }; gource-0.54/src/tinyxml/tinyxml.cpp0000644002342600234260000011132714362112042017271 0ustar andrewcandrewc/* www.sourceforge.net/projects/tinyxml Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #include #ifdef TIXML_USE_STL #include #include #endif #include "tinyxml.h" FILE* TiXmlFOpen( const char* filename, const char* mode ); bool TiXmlBase::condenseWhiteSpace = true; // Microsoft compiler security FILE* TiXmlFOpen( const char* filename, const char* mode ) { #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) FILE* fp = 0; errno_t err = fopen_s( &fp, filename, mode ); if ( !err && fp ) return fp; return 0; #else return fopen( filename, mode ); #endif } void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) { int i=0; while( i<(int)str.length() ) { unsigned char c = (unsigned char) str[i]; if ( c == '&' && i < ( (int)str.length() - 2 ) && str[i+1] == '#' && str[i+2] == 'x' ) { // Hexadecimal character reference. // Pass through unchanged. // © -- copyright symbol, for example. // // The -1 is a bug fix from Rob Laveaux. It keeps // an overflow from happening if there is no ';'. // There are actually 2 ways to exit this loop - // while fails (error case) and break (semicolon found). // However, there is no mechanism (currently) for // this function to return an error. while ( i<(int)str.length()-1 ) { outString->append( str.c_str() + i, 1 ); ++i; if ( str[i] == ';' ) break; } } else if ( c == '&' ) { outString->append( entity[0].str, entity[0].strLength ); ++i; } else if ( c == '<' ) { outString->append( entity[1].str, entity[1].strLength ); ++i; } else if ( c == '>' ) { outString->append( entity[2].str, entity[2].strLength ); ++i; } else if ( c == '\"' ) { outString->append( entity[3].str, entity[3].strLength ); ++i; } else if ( c == '\'' ) { outString->append( entity[4].str, entity[4].strLength ); ++i; } else if ( c < 32 ) { // Easy pass at non-alpha/numeric/symbol // Below 32 is symbolic. char buf[ 32 ]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); #else sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); #endif //*ME: warning C4267: convert 'size_t' to 'int' //*ME: Int-Cast to make compiler happy ... outString->append( buf, (int)strlen( buf ) ); ++i; } else { //char realc = (char) c; //outString->append( &realc, 1 ); *outString += (char) c; // somewhat more efficient function call. ++i; } } } TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() { parent = 0; type = _type; firstChild = 0; lastChild = 0; prev = 0; next = 0; } TiXmlNode::~TiXmlNode() { TiXmlNode* node = firstChild; TiXmlNode* temp = 0; while ( node ) { temp = node; node = node->next; delete temp; } } void TiXmlNode::CopyTo( TiXmlNode* target ) const { target->SetValue (value.c_str() ); target->userData = userData; target->location = location; } void TiXmlNode::Clear() { TiXmlNode* node = firstChild; TiXmlNode* temp = 0; while ( node ) { temp = node; node = node->next; delete temp; } firstChild = 0; lastChild = 0; } TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) { assert( node->parent == 0 || node->parent == this ); assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() ); if ( node->Type() == TiXmlNode::TINYXML_DOCUMENT ) { delete node; if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } node->parent = this; node->prev = lastChild; node->next = 0; if ( lastChild ) lastChild->next = node; else firstChild = node; // it was an empty list. lastChild = node; return node; } TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) { if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; return LinkEndChild( node ); } TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) { if ( !beforeThis || beforeThis->parent != this ) { return 0; } if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; node->parent = this; node->next = beforeThis; node->prev = beforeThis->prev; if ( beforeThis->prev ) { beforeThis->prev->next = node; } else { assert( firstChild == beforeThis ); firstChild = node; } beforeThis->prev = node; return node; } TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) { if ( !afterThis || afterThis->parent != this ) { return 0; } if ( addThis.Type() == TiXmlNode::TINYXML_DOCUMENT ) { if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = addThis.Clone(); if ( !node ) return 0; node->parent = this; node->prev = afterThis; node->next = afterThis->next; if ( afterThis->next ) { afterThis->next->prev = node; } else { assert( lastChild == afterThis ); lastChild = node; } afterThis->next = node; return node; } TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) { if ( !replaceThis ) return 0; if ( replaceThis->parent != this ) return 0; if ( withThis.ToDocument() ) { // A document can never be a child. Thanks to Noam. TiXmlDocument* document = GetDocument(); if ( document ) document->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); return 0; } TiXmlNode* node = withThis.Clone(); if ( !node ) return 0; node->next = replaceThis->next; node->prev = replaceThis->prev; if ( replaceThis->next ) replaceThis->next->prev = node; else lastChild = node; if ( replaceThis->prev ) replaceThis->prev->next = node; else firstChild = node; delete replaceThis; node->parent = this; return node; } bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) { if ( !removeThis ) { return false; } if ( removeThis->parent != this ) { assert( 0 ); return false; } if ( removeThis->next ) removeThis->next->prev = removeThis->prev; else lastChild = removeThis->prev; if ( removeThis->prev ) removeThis->prev->next = removeThis->next; else firstChild = removeThis->next; delete removeThis; return true; } const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const { const TiXmlNode* node; for ( node = firstChild; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const { const TiXmlNode* node; for ( node = lastChild; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const { if ( !previous ) { return FirstChild(); } else { assert( previous->parent == this ); return previous->NextSibling(); } } const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const { if ( !previous ) { return FirstChild( val ); } else { assert( previous->parent == this ); return previous->NextSibling( val ); } } const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const { const TiXmlNode* node; for ( node = next; node; node = node->next ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const { const TiXmlNode* node; for ( node = prev; node; node = node->prev ) { if ( strcmp( node->Value(), _value ) == 0 ) return node; } return 0; } void TiXmlElement::RemoveAttribute( const char * name ) { #ifdef TIXML_USE_STL TIXML_STRING str( name ); TiXmlAttribute* node = attributeSet.Find( str ); #else TiXmlAttribute* node = attributeSet.Find( name ); #endif if ( node ) { attributeSet.Remove( node ); delete node; } } const TiXmlElement* TiXmlNode::FirstChildElement() const { const TiXmlNode* node; for ( node = FirstChild(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const { const TiXmlNode* node; for ( node = FirstChild( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::NextSiblingElement() const { const TiXmlNode* node; for ( node = NextSibling(); node; node = node->NextSibling() ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const { const TiXmlNode* node; for ( node = NextSibling( _value ); node; node = node->NextSibling( _value ) ) { if ( node->ToElement() ) return node->ToElement(); } return 0; } const TiXmlDocument* TiXmlNode::GetDocument() const { const TiXmlNode* node; for( node = this; node; node = node->parent ) { if ( node->ToDocument() ) return node->ToDocument(); } return 0; } TiXmlElement::TiXmlElement (const char * _value) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; value = _value; } #ifdef TIXML_USE_STL TiXmlElement::TiXmlElement( const std::string& _value ) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; value = _value; } #endif TiXmlElement::TiXmlElement( const TiXmlElement& copy) : TiXmlNode( TiXmlNode::TINYXML_ELEMENT ) { firstChild = lastChild = 0; copy.CopyTo( this ); } TiXmlElement& TiXmlElement::operator=( const TiXmlElement& base ) { ClearThis(); base.CopyTo( this ); return *this; } TiXmlElement::~TiXmlElement() { ClearThis(); } void TiXmlElement::ClearThis() { Clear(); while( attributeSet.First() ) { TiXmlAttribute* node = attributeSet.First(); attributeSet.Remove( node ); delete node; } } const char* TiXmlElement::Attribute( const char* name ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( node ) return node->Value(); return 0; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( attrib ) return &attrib->ValueStr(); return 0; } #endif const char* TiXmlElement::Attribute( const char* name, int* i ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const char* result = 0; if ( attrib ) { result = attrib->Value(); if ( i ) { attrib->QueryIntValue( i ); } } return result; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const std::string* result = 0; if ( attrib ) { result = &attrib->ValueStr(); if ( i ) { attrib->QueryIntValue( i ); } } return result; } #endif const char* TiXmlElement::Attribute( const char* name, double* d ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const char* result = 0; if ( attrib ) { result = attrib->Value(); if ( d ) { attrib->QueryDoubleValue( d ); } } return result; } #ifdef TIXML_USE_STL const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); const std::string* result = 0; if ( attrib ) { result = &attrib->ValueStr(); if ( d ) { attrib->QueryDoubleValue( d ); } } return result; } #endif int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryIntValue( ival ); } int TiXmlElement::QueryUnsignedAttribute( const char* name, unsigned* value ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; int ival = 0; int result = node->QueryIntValue( &ival ); *value = (unsigned)ival; return result; } int TiXmlElement::QueryBoolAttribute( const char* name, bool* bval ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; int result = TIXML_WRONG_TYPE; if ( StringEqual( node->Value(), "true", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "yes", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "1", true, TIXML_ENCODING_UNKNOWN ) ) { *bval = true; result = TIXML_SUCCESS; } else if ( StringEqual( node->Value(), "false", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "no", true, TIXML_ENCODING_UNKNOWN ) || StringEqual( node->Value(), "0", true, TIXML_ENCODING_UNKNOWN ) ) { *bval = false; result = TIXML_SUCCESS; } return result; } #ifdef TIXML_USE_STL int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryIntValue( ival ); } #endif int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryDoubleValue( dval ); } #ifdef TIXML_USE_STL int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const { const TiXmlAttribute* attrib = attributeSet.Find( name ); if ( !attrib ) return TIXML_NO_ATTRIBUTE; return attrib->QueryDoubleValue( dval ); } #endif void TiXmlElement::SetAttribute( const char * name, int val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetIntValue( val ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetAttribute( const std::string& name, int val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetIntValue( val ); } } #endif void TiXmlElement::SetDoubleAttribute( const char * name, double val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetDoubleValue( val ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetDoubleAttribute( const std::string& name, double val ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( name ); if ( attrib ) { attrib->SetDoubleValue( val ); } } #endif void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( cname ); if ( attrib ) { attrib->SetValue( cvalue ); } } #ifdef TIXML_USE_STL void TiXmlElement::SetAttribute( const std::string& _name, const std::string& _value ) { TiXmlAttribute* attrib = attributeSet.FindOrCreate( _name ); if ( attrib ) { attrib->SetValue( _value ); } } #endif void TiXmlElement::Print( FILE* cfile, int depth ) const { int i; assert( cfile ); for ( i=0; iNext() ) { fprintf( cfile, " " ); attrib->Print( cfile, depth ); } // There are 3 different formatting approaches: // 1) An element without children is printed as a node // 2) An element with only a text child is printed as text // 3) An element with children is printed on multiple lines. TiXmlNode* node; if ( !firstChild ) { fprintf( cfile, " />" ); } else if ( firstChild == lastChild && firstChild->ToText() ) { fprintf( cfile, ">" ); firstChild->Print( cfile, depth + 1 ); fprintf( cfile, "", value.c_str() ); } else { fprintf( cfile, ">" ); for ( node = firstChild; node; node=node->NextSibling() ) { if ( !node->ToText() ) { fprintf( cfile, "\n" ); } node->Print( cfile, depth+1 ); } fprintf( cfile, "\n" ); for( i=0; i", value.c_str() ); } } void TiXmlElement::CopyTo( TiXmlElement* target ) const { // superclass: TiXmlNode::CopyTo( target ); // Element class: // Clone the attributes, then clone the children. const TiXmlAttribute* attribute = 0; for( attribute = attributeSet.First(); attribute; attribute = attribute->Next() ) { target->SetAttribute( attribute->Name(), attribute->Value() ); } TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } } bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const { if ( visitor->VisitEnter( *this, attributeSet.First() ) ) { for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { if ( !node->Accept( visitor ) ) break; } } return visitor->VisitExit( *this ); } TiXmlNode* TiXmlElement::Clone() const { TiXmlElement* clone = new TiXmlElement( Value() ); if ( !clone ) return 0; CopyTo( clone ); return clone; } const char* TiXmlElement::GetText() const { const TiXmlNode* child = this->FirstChild(); if ( child ) { const TiXmlText* childText = child->ToText(); if ( childText ) { return childText->Value(); } } return 0; } TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; ClearError(); } TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; value = documentName; ClearError(); } #ifdef TIXML_USE_STL TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { tabsize = 4; useMicrosoftBOM = false; value = documentName; ClearError(); } #endif TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::TINYXML_DOCUMENT ) { copy.CopyTo( this ); } TiXmlDocument& TiXmlDocument::operator=( const TiXmlDocument& copy ) { Clear(); copy.CopyTo( this ); return *this; } bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) { return LoadFile( Value(), encoding ); } bool TiXmlDocument::SaveFile() const { return SaveFile( Value() ); } bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding ) { TIXML_STRING filename( _filename ); value = filename; // reading in binary mode so that tinyxml can normalize the EOL FILE* file = TiXmlFOpen( value.c_str (), "rb" ); if ( file ) { bool result = LoadFile( file, encoding ); fclose( file ); return result; } else { SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } } bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding ) { if ( !file ) { SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Delete the existing data: Clear(); location.Clear(); // Get the file size, so we can pre-allocate the string. HUGE speed impact. long length = 0; fseek( file, 0, SEEK_END ); length = ftell( file ); fseek( file, 0, SEEK_SET ); // Strange case, but good to handle up front. if ( length <= 0 ) { SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Subtle bug here. TinyXml did use fgets. But from the XML spec: // 2.11 End-of-Line Handling // // // ...the XML processor MUST behave as if it normalized all line breaks in external // parsed entities (including the document entity) on input, before parsing, by translating // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to // a single #xA character. // // // It is not clear fgets does that, and certainly isn't clear it works cross platform. // Generally, you expect fgets to translate from the convention of the OS to the c/unix // convention, and not work generally. /* while( fgets( buf, sizeof(buf), file ) ) { data += buf; } */ char* buf = new char[ length+1 ]; buf[0] = 0; if ( fread( buf, length, 1, file ) != 1 ) { delete [] buf; SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); return false; } // Process the buffer in place to normalize new lines. (See comment above.) // Copies from the 'p' to 'q' pointer, where p can advance faster if // a newline-carriage return is hit. // // Wikipedia: // Systems based on ASCII or a compatible character set use either LF (Line feed, '\n', 0x0A, 10 in decimal) or // CR (Carriage return, '\r', 0x0D, 13 in decimal) individually, or CR followed by LF (CR+LF, 0x0D 0x0A)... // * LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others // * CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS // * CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 const char* p = buf; // the read head char* q = buf; // the write head const char CR = 0x0d; const char LF = 0x0a; buf[length] = 0; while( *p ) { assert( p < (buf+length) ); assert( q <= (buf+length) ); assert( q <= p ); if ( *p == CR ) { *q++ = LF; p++; if ( *p == LF ) { // check for CR+LF (and skip LF) p++; } } else { *q++ = *p++; } } assert( q <= (buf+length) ); *q = 0; Parse( buf, 0, encoding ); delete [] buf; return !Error(); } bool TiXmlDocument::SaveFile( const char * filename ) const { // The old c stuff lives on... FILE* fp = TiXmlFOpen( filename, "w" ); if ( fp ) { bool result = SaveFile( fp ); fclose( fp ); return result; } return false; } bool TiXmlDocument::SaveFile( FILE* fp ) const { if ( useMicrosoftBOM ) { const unsigned char TIXML_UTF_LEAD_0 = 0xefU; const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; fputc( TIXML_UTF_LEAD_0, fp ); fputc( TIXML_UTF_LEAD_1, fp ); fputc( TIXML_UTF_LEAD_2, fp ); } Print( fp, 0 ); return (ferror(fp) == 0); } void TiXmlDocument::CopyTo( TiXmlDocument* target ) const { TiXmlNode::CopyTo( target ); target->error = error; target->errorId = errorId; target->errorDesc = errorDesc; target->tabsize = tabsize; target->errorLocation = errorLocation; target->useMicrosoftBOM = useMicrosoftBOM; TiXmlNode* node = 0; for ( node = firstChild; node; node = node->NextSibling() ) { target->LinkEndChild( node->Clone() ); } } TiXmlNode* TiXmlDocument::Clone() const { TiXmlDocument* clone = new TiXmlDocument(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlDocument::Print( FILE* cfile, int depth ) const { assert( cfile ); for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { node->Print( cfile, depth ); fprintf( cfile, "\n" ); } } bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const { if ( visitor->VisitEnter( *this ) ) { for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) { if ( !node->Accept( visitor ) ) break; } } return visitor->VisitExit( *this ); } const TiXmlAttribute* TiXmlAttribute::Next() const { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( next->value.empty() && next->name.empty() ) return 0; return next; } /* TiXmlAttribute* TiXmlAttribute::Next() { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( next->value.empty() && next->name.empty() ) return 0; return next; } */ const TiXmlAttribute* TiXmlAttribute::Previous() const { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( prev->value.empty() && prev->name.empty() ) return 0; return prev; } /* TiXmlAttribute* TiXmlAttribute::Previous() { // We are using knowledge of the sentinel. The sentinel // have a value or name. if ( prev->value.empty() && prev->name.empty() ) return 0; return prev; } */ void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const { TIXML_STRING n, v; EncodeString( name, &n ); EncodeString( value, &v ); if (value.find ('\"') == TIXML_STRING::npos) { if ( cfile ) { fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); } if ( str ) { (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\""; } } else { if ( cfile ) { fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); } if ( str ) { (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'"; } } } int TiXmlAttribute::QueryIntValue( int* ival ) const { if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } int TiXmlAttribute::QueryDoubleValue( double* dval ) const { if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } void TiXmlAttribute::SetIntValue( int _value ) { char buf [64]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); #else sprintf (buf, "%d", _value); #endif SetValue (buf); } void TiXmlAttribute::SetDoubleValue( double _value ) { char buf [256]; #if defined(TIXML_SNPRINTF) TIXML_SNPRINTF( buf, sizeof(buf), "%g", _value); #else sprintf (buf, "%g", _value); #endif SetValue (buf); } int TiXmlAttribute::IntValue() const { return atoi (value.c_str ()); } double TiXmlAttribute::DoubleValue() const { return atof (value.c_str ()); } TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { copy.CopyTo( this ); } TiXmlComment& TiXmlComment::operator=( const TiXmlComment& base ) { Clear(); base.CopyTo( this ); return *this; } void TiXmlComment::Print( FILE* cfile, int depth ) const { assert( cfile ); for ( int i=0; i", value.c_str() ); } void TiXmlComment::CopyTo( TiXmlComment* target ) const { TiXmlNode::CopyTo( target ); } bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlComment::Clone() const { TiXmlComment* clone = new TiXmlComment(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlText::Print( FILE* cfile, int depth ) const { assert( cfile ); if ( cdata ) { int i; fprintf( cfile, "\n" ); for ( i=0; i\n", value.c_str() ); // unformatted output } else { TIXML_STRING buffer; EncodeString( value, &buffer ); fprintf( cfile, "%s", buffer.c_str() ); } } void TiXmlText::CopyTo( TiXmlText* target ) const { TiXmlNode::CopyTo( target ); target->cdata = cdata; } bool TiXmlText::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlText::Clone() const { TiXmlText* clone = 0; clone = new TiXmlText( "" ); if ( !clone ) return 0; CopyTo( clone ); return clone; } TiXmlDeclaration::TiXmlDeclaration( const char * _version, const char * _encoding, const char * _standalone ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { version = _version; encoding = _encoding; standalone = _standalone; } #ifdef TIXML_USE_STL TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { version = _version; encoding = _encoding; standalone = _standalone; } #endif TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) { copy.CopyTo( this ); } TiXmlDeclaration& TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) { Clear(); copy.CopyTo( this ); return *this; } void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const { if ( cfile ) fprintf( cfile, "" ); if ( str ) (*str) += "?>"; } void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const { TiXmlNode::CopyTo( target ); target->version = version; target->encoding = encoding; target->standalone = standalone; } bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlDeclaration::Clone() const { TiXmlDeclaration* clone = new TiXmlDeclaration(); if ( !clone ) return 0; CopyTo( clone ); return clone; } void TiXmlUnknown::Print( FILE* cfile, int depth ) const { for ( int i=0; i", value.c_str() ); } void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const { TiXmlNode::CopyTo( target ); } bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const { return visitor->Visit( *this ); } TiXmlNode* TiXmlUnknown::Clone() const { TiXmlUnknown* clone = new TiXmlUnknown(); if ( !clone ) return 0; CopyTo( clone ); return clone; } TiXmlAttributeSet::TiXmlAttributeSet() { sentinel.next = &sentinel; sentinel.prev = &sentinel; } TiXmlAttributeSet::~TiXmlAttributeSet() { assert( sentinel.next == &sentinel ); assert( sentinel.prev == &sentinel ); } void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) { #ifdef TIXML_USE_STL assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set. #else assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. #endif addMe->next = &sentinel; addMe->prev = sentinel.prev; sentinel.prev->next = addMe; sentinel.prev = addMe; } void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) { TiXmlAttribute* node; for( node = sentinel.next; node != &sentinel; node = node->next ) { if ( node == removeMe ) { node->prev->next = node->next; node->next->prev = node->prev; node->next = 0; node->prev = 0; return; } } assert( 0 ); // we tried to remove a non-linked attribute. } #ifdef TIXML_USE_STL TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const { for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) { if ( node->name == name ) return node; } return 0; } TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const std::string& _name ) { TiXmlAttribute* attrib = Find( _name ); if ( !attrib ) { attrib = new TiXmlAttribute(); Add( attrib ); attrib->SetName( _name ); } return attrib; } #endif TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const { for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) { if ( strcmp( node->name.c_str(), name ) == 0 ) return node; } return 0; } TiXmlAttribute* TiXmlAttributeSet::FindOrCreate( const char* _name ) { TiXmlAttribute* attrib = Find( _name ); if ( !attrib ) { attrib = new TiXmlAttribute(); Add( attrib ); attrib->SetName( _name ); } return attrib; } #ifdef TIXML_USE_STL std::istream& operator>> (std::istream & in, TiXmlNode & base) { TIXML_STRING tag; tag.reserve( 8 * 1000 ); base.StreamIn( &in, &tag ); base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); return in; } #endif #ifdef TIXML_USE_STL std::ostream& operator<< (std::ostream & out, const TiXmlNode & base) { TiXmlPrinter printer; printer.SetStreamPrinting(); base.Accept( &printer ); out << printer.Str(); return out; } std::string& operator<< (std::string& out, const TiXmlNode& base ) { TiXmlPrinter printer; printer.SetStreamPrinting(); base.Accept( &printer ); out.append( printer.Str() ); return out; } #endif TiXmlHandle TiXmlHandle::FirstChild() const { if ( node ) { TiXmlNode* child = node->FirstChild(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const { if ( node ) { TiXmlNode* child = node->FirstChild( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement() const { if ( node ) { TiXmlElement* child = node->FirstChildElement(); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const { if ( node ) { TiXmlElement* child = node->FirstChildElement( value ); if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( int count ) const { if ( node ) { int i; TiXmlNode* child = node->FirstChild(); for ( i=0; child && iNextSibling(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const { if ( node ) { int i; TiXmlNode* child = node->FirstChild( value ); for ( i=0; child && iNextSibling( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( int count ) const { if ( node ) { int i; TiXmlElement* child = node->FirstChildElement(); for ( i=0; child && iNextSiblingElement(), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const { if ( node ) { int i; TiXmlElement* child = node->FirstChildElement( value ); for ( i=0; child && iNextSiblingElement( value ), ++i ) { // nothing } if ( child ) return TiXmlHandle( child ); } return TiXmlHandle( 0 ); } bool TiXmlPrinter::VisitEnter( const TiXmlDocument& ) { return true; } bool TiXmlPrinter::VisitExit( const TiXmlDocument& ) { return true; } bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) { DoIndent(); buffer += "<"; buffer += element.Value(); for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) { buffer += " "; attrib->Print( 0, 0, &buffer ); } if ( !element.FirstChild() ) { buffer += " />"; DoLineBreak(); } else { buffer += ">"; if ( element.FirstChild()->ToText() && element.LastChild() == element.FirstChild() && element.FirstChild()->ToText()->CDATA() == false ) { simpleTextPrint = true; // no DoLineBreak()! } else { DoLineBreak(); } } ++depth; return true; } bool TiXmlPrinter::VisitExit( const TiXmlElement& element ) { --depth; if ( !element.FirstChild() ) { // nothing. } else { if ( simpleTextPrint ) { simpleTextPrint = false; } else { DoIndent(); } buffer += ""; DoLineBreak(); } return true; } bool TiXmlPrinter::Visit( const TiXmlText& text ) { if ( text.CDATA() ) { DoIndent(); buffer += ""; DoLineBreak(); } else if ( simpleTextPrint ) { TIXML_STRING str; TiXmlBase::EncodeString( text.ValueTStr(), &str ); buffer += str; } else { DoIndent(); TIXML_STRING str; TiXmlBase::EncodeString( text.ValueTStr(), &str ); buffer += str; DoLineBreak(); } return true; } bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration ) { DoIndent(); declaration.Print( 0, 0, &buffer ); DoLineBreak(); return true; } bool TiXmlPrinter::Visit( const TiXmlComment& comment ) { DoIndent(); buffer += ""; DoLineBreak(); return true; } bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown ) { DoIndent(); buffer += "<"; buffer += unknown.Value(); buffer += ">"; DoLineBreak(); return true; } gource-0.54/src/tinyxml/tinyxml.h0000644002342600234260000017650214362112042016744 0ustar andrewcandrewc/* www.sourceforge.net/projects/tinyxml Original code by Lee Thomason (www.grinninglizard.com) This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ #ifndef TINYXML_INCLUDED #define TINYXML_INCLUDED #ifdef _MSC_VER #pragma warning( push ) #pragma warning( disable : 4530 ) #pragma warning( disable : 4786 ) #endif #include #include #include #include #include // Help out windows: #if defined( _DEBUG ) && !defined( DEBUG ) #define DEBUG #endif #ifdef TIXML_USE_STL #include #include #include #define TIXML_STRING std::string #else #include "tinystr.h" #define TIXML_STRING TiXmlString #endif // Deprecated library function hell. Compilers want to use the // new safe versions. This probably doesn't fully address the problem, // but it gets closer. There are too many compilers for me to fully // test. If you get compilation troubles, undefine TIXML_SAFE #define TIXML_SAFE #ifdef TIXML_SAFE #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) // Microsoft visual studio, version 2005 and higher. #define TIXML_SNPRINTF _snprintf_s #define TIXML_SSCANF sscanf_s #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) // Microsoft visual studio, version 6 and higher. //#pragma message( "Using _sn* functions." ) #define TIXML_SNPRINTF _snprintf #define TIXML_SSCANF sscanf #elif defined(__GNUC__) && (__GNUC__ >= 3 ) // GCC version 3 and higher.s //#warning( "Using sn* functions." ) #define TIXML_SNPRINTF snprintf #define TIXML_SSCANF sscanf #else #define TIXML_SNPRINTF snprintf #define TIXML_SSCANF sscanf #endif #endif class TiXmlDocument; class TiXmlElement; class TiXmlComment; class TiXmlUnknown; class TiXmlAttribute; class TiXmlText; class TiXmlDeclaration; class TiXmlParsingData; const int TIXML_MAJOR_VERSION = 2; const int TIXML_MINOR_VERSION = 6; const int TIXML_PATCH_VERSION = 2; /* Internal structure for tracking location of items in the XML file. */ struct TiXmlCursor { TiXmlCursor() { Clear(); } void Clear() { row = col = -1; } int row; // 0 based. int col; // 0 based. }; /** Implements the interface to the "Visitor pattern" (see the Accept() method.) If you call the Accept() method, it requires being passed a TiXmlVisitor class to handle callbacks. For nodes that contain other nodes (Document, Element) you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves are simply called with Visit(). If you return 'true' from a Visit method, recursive parsing will continue. If you return false, no children of this node or its sibilings will be Visited. All flavors of Visit methods have a default implementation that returns 'true' (continue visiting). You need to only override methods that are interesting to you. Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. You should never change the document from a callback. @sa TiXmlNode::Accept() */ class TiXmlVisitor { public: virtual ~TiXmlVisitor() {} /// Visit a document. virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } /// Visit a document. virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } /// Visit an element. virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } /// Visit an element. virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } /// Visit a declaration virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } /// Visit a text node virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } /// Visit a comment node virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } /// Visit an unknown node virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } }; // Only used by Attribute::Query functions enum { TIXML_SUCCESS, TIXML_NO_ATTRIBUTE, TIXML_WRONG_TYPE }; // Used by the parsing routines. enum TiXmlEncoding { TIXML_ENCODING_UNKNOWN, TIXML_ENCODING_UTF8, TIXML_ENCODING_LEGACY }; const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; /** TiXmlBase is a base class for every class in TinyXml. It does little except to establish that TinyXml classes can be printed and provide some utility functions. In XML, the document and elements can contain other elements and other types of nodes. @verbatim A Document can contain: Element (container or leaf) Comment (leaf) Unknown (leaf) Declaration( leaf ) An Element can contain: Element (container or leaf) Text (leaf) Attributes (not on tree) Comment (leaf) Unknown (leaf) A Decleration contains: Attributes (not on tree) @endverbatim */ class TiXmlBase { friend class TiXmlNode; friend class TiXmlElement; friend class TiXmlDocument; public: TiXmlBase() : userData(0) {} virtual ~TiXmlBase() {} /** All TinyXml classes can print themselves to a filestream or the string class (TiXmlString in non-STL mode, std::string in STL mode.) Either or both cfile and str can be null. This is a formatted print, and will insert tabs and newlines. (For an unformatted stream, use the << operator.) */ virtual void Print( FILE* cfile, int depth ) const = 0; /** The world does not agree on whether white space should be kept or not. In order to make everyone happy, these global, static functions are provided to set whether or not TinyXml will condense all white space into a single space or not. The default is to condense. Note changing this value is not thread safe. */ static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } /// Return the current white space setting. static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } /** Return the position, in the original source file, of this node or attribute. The row and column are 1-based. (That is the first row and first column is 1,1). If the returns values are 0 or less, then the parser does not have a row and column value. Generally, the row and column value will be set when the TiXmlDocument::Load(), TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set when the DOM was created from operator>>. The values reflect the initial load. Once the DOM is modified programmatically (by adding or changing nodes and attributes) the new values will NOT update to reflect changes in the document. There is a minor performance cost to computing the row and column. Computation can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. @sa TiXmlDocument::SetTabSize() */ int Row() const { return location.row + 1; } int Column() const { return location.col + 1; } ///< See Row() void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. // Table that returs, for a given lead byte, the total number of bytes // in the UTF-8 sequence. static const int utf8ByteTable[256]; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, or they will be transformed into entities! */ static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); enum { TIXML_NO_ERROR = 0, TIXML_ERROR, TIXML_ERROR_OPENING_FILE, TIXML_ERROR_PARSING_ELEMENT, TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, TIXML_ERROR_READING_ELEMENT_VALUE, TIXML_ERROR_READING_ATTRIBUTES, TIXML_ERROR_PARSING_EMPTY, TIXML_ERROR_READING_END_TAG, TIXML_ERROR_PARSING_UNKNOWN, TIXML_ERROR_PARSING_COMMENT, TIXML_ERROR_PARSING_DECLARATION, TIXML_ERROR_DOCUMENT_EMPTY, TIXML_ERROR_EMBEDDED_NULL, TIXML_ERROR_PARSING_CDATA, TIXML_ERROR_DOCUMENT_TOP_ONLY, TIXML_ERROR_STRING_COUNT }; protected: static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); inline static bool IsWhiteSpace( char c ) { return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); } inline static bool IsWhiteSpace( int c ) { if ( c < 256 ) return IsWhiteSpace( (char) c ); return false; // Again, only truly correct for English/Latin...but usually works. } #ifdef TIXML_USE_STL static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); #endif /* Reads an XML name into the string provided. Returns a pointer just past the last character of the name, or 0 if the function has an error. */ static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); /* Reads text. Returns a pointer past the given end tag. Wickedly complex options, but it keeps the (sensitive) code in one place. */ static const char* ReadText( const char* in, // where to start TIXML_STRING* text, // the string read bool ignoreWhiteSpace, // whether to keep the white space const char* endTag, // what ends this text bool ignoreCase, // whether to ignore case in the end tag TiXmlEncoding encoding ); // the current encoding // If an entity has been found, transform it into a character. static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); // Get a character, while interpreting entities. // The length can be from 0 to 4 bytes. inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) { assert( p ); if ( encoding == TIXML_ENCODING_UTF8 ) { *length = utf8ByteTable[ *((const unsigned char*)p) ]; assert( *length >= 0 && *length < 5 ); } else { *length = 1; } if ( *length == 1 ) { if ( *p == '&' ) return GetEntity( p, _value, length, encoding ); *_value = *p; return p+1; } else if ( *length ) { //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), // and the null terminator isn't needed for( int i=0; p[i] && i<*length; ++i ) { _value[i] = p[i]; } return p + (*length); } else { // Not valid text. return 0; } } // Return true if the next characters in the stream are any of the endTag sequences. // Ignore case only works for english, and should only be relied on when comparing // to English words: StringEqual( p, "version", true ) is fine. static bool StringEqual( const char* p, const char* endTag, bool ignoreCase, TiXmlEncoding encoding ); static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; TiXmlCursor location; /// Field containing a generic user pointer void* userData; // None of these methods are reliable for any language except English. // Good for approximation, not great for accuracy. static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); inline static int ToLower( int v, TiXmlEncoding encoding ) { if ( encoding == TIXML_ENCODING_UTF8 ) { if ( v < 128 ) return tolower( v ); return v; } else { return tolower( v ); } } static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); private: TiXmlBase( const TiXmlBase& ); // not implemented. void operator=( const TiXmlBase& base ); // not allowed. struct Entity { const char* str; unsigned int strLength; char chr; }; enum { NUM_ENTITY = 5, MAX_ENTITY_LENGTH = 6 }; static Entity entity[ NUM_ENTITY ]; static bool condenseWhiteSpace; }; /** The parent class for everything in the Document Object Model. (Except for attributes). Nodes have siblings, a parent, and children. A node can be in a document, or stand on its own. The type of a TiXmlNode can be queried, and it can be cast to its more defined type. */ class TiXmlNode : public TiXmlBase { friend class TiXmlDocument; friend class TiXmlElement; public: #ifdef TIXML_USE_STL /** An input stream operator, for every class. Tolerant of newlines and formatting, but doesn't expect them. */ friend std::istream& operator >> (std::istream& in, TiXmlNode& base); /** An output stream operator, for every class. Note that this outputs without any newlines or formatting, as opposed to Print(), which includes tabs and new lines. The operator<< and operator>> are not completely symmetric. Writing a node to a stream is very well defined. You'll get a nice stream of output, without any extra whitespace or newlines. But reading is not as well defined. (As it always is.) If you create a TiXmlElement (for example) and read that from an input stream, the text needs to define an element or junk will result. This is true of all input streams, but it's worth keeping in mind. A TiXmlDocument will read nodes until it reads a root element, and all the children of that root element. */ friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); /// Appends the XML node or attribute to a std::string. friend std::string& operator<< (std::string& out, const TiXmlNode& base ); #endif /** The types of XML nodes supported by TinyXml. (All the unsupported types are picked up by UNKNOWN.) */ enum NodeType { TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, TINYXML_UNKNOWN, TINYXML_TEXT, TINYXML_DECLARATION, TINYXML_TYPECOUNT }; virtual ~TiXmlNode(); /** The meaning of 'value' changes for the specific type of TiXmlNode. @verbatim Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string @endverbatim The subclasses will wrap this function. */ const char *Value() const { return value.c_str (); } #ifdef TIXML_USE_STL /** Return Value() as a std::string. If you only use STL, this is more efficient than calling Value(). Only available in STL mode. */ const std::string& ValueStr() const { return value; } #endif const TIXML_STRING& ValueTStr() const { return value; } /** Changes the value of the node. Defined as: @verbatim Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string @endverbatim */ void SetValue(const char * _value) { value = _value;} #ifdef TIXML_USE_STL /// STL std::string form. void SetValue( const std::string& _value ) { value = _value; } #endif /// Delete all the children of this node. Does not affect 'this'. void Clear(); /// One step up the DOM. TiXmlNode* Parent() { return parent; } const TiXmlNode* Parent() const { return parent; } const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. TiXmlNode* FirstChild() { return firstChild; } const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. /// The first child of this node with the matching 'value'. Will be null if none found. TiXmlNode* FirstChild( const char * _value ) { // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) // call the method, cast the return back to non-const. return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); } const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. TiXmlNode* LastChild() { return lastChild; } const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. TiXmlNode* LastChild( const char * _value ) { return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); } #ifdef TIXML_USE_STL const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. #endif /** An alternate way to walk the children of a node. One way to iterate over nodes is: @verbatim for( child = parent->FirstChild(); child; child = child->NextSibling() ) @endverbatim IterateChildren does the same thing with the syntax: @verbatim child = 0; while( child = parent->IterateChildren( child ) ) @endverbatim IterateChildren takes the previous child as input and finds the next one. If the previous child is null, it returns the first. IterateChildren will return null when done. */ const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; TiXmlNode* IterateChildren( const TiXmlNode* previous ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); } /// This flavor of IterateChildren searches for children with a particular 'value' const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); } #ifdef TIXML_USE_STL const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. #endif /** Add a new node related to this. Adds a child past the LastChild. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); /** Add a new node related to this. Adds a child past the LastChild. NOTE: the node to be added is passed by pointer, and will be henceforth owned (and deleted) by tinyXml. This method is efficient and avoids an extra copy, but should be used with care as it uses a different memory model than the other insert functions. @sa InsertEndChild */ TiXmlNode* LinkEndChild( TiXmlNode* addThis ); /** Add a new node related to this. Adds a child before the specified child. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); /** Add a new node related to this. Adds a child after the specified child. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); /** Replace a child of this node. Returns a pointer to the new object or NULL if an error occured. */ TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); /// Delete a child of this node. bool RemoveChild( TiXmlNode* removeThis ); /// Navigate to a sibling node. const TiXmlNode* PreviousSibling() const { return prev; } TiXmlNode* PreviousSibling() { return prev; } /// Navigate to a sibling node. const TiXmlNode* PreviousSibling( const char * ) const; TiXmlNode* PreviousSibling( const char *_prev ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); } #ifdef TIXML_USE_STL const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. #endif /// Navigate to a sibling node. const TiXmlNode* NextSibling() const { return next; } TiXmlNode* NextSibling() { return next; } /// Navigate to a sibling node with the given 'value'. const TiXmlNode* NextSibling( const char * ) const; TiXmlNode* NextSibling( const char* _next ) { return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); } /** Convenience function to get through elements. Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element. */ const TiXmlElement* NextSiblingElement() const; TiXmlElement* NextSiblingElement() { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); } /** Convenience function to get through elements. Calls NextSibling and ToElement. Will skip all non-Element nodes. Returns 0 if there is not another element. */ const TiXmlElement* NextSiblingElement( const char * ) const; TiXmlElement* NextSiblingElement( const char *_next ) { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); } #ifdef TIXML_USE_STL const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. #endif /// Convenience function to get through elements. const TiXmlElement* FirstChildElement() const; TiXmlElement* FirstChildElement() { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); } /// Convenience function to get through elements. const TiXmlElement* FirstChildElement( const char * _value ) const; TiXmlElement* FirstChildElement( const char * _value ) { return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); } #ifdef TIXML_USE_STL const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. #endif /** Query the type (as an enumerated value, above) of this node. The possible types are: TINYXML_DOCUMENT, TINYXML_ELEMENT, TINYXML_COMMENT, TINYXML_UNKNOWN, TINYXML_TEXT, and TINYXML_DECLARATION. */ int Type() const { return type; } /** Return a pointer to the Document this node lives in. Returns null if not in a document. */ const TiXmlDocument* GetDocument() const; TiXmlDocument* GetDocument() { return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); } /// Returns true if this node has no children. bool NoChildren() const { return !firstChild; } virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. /** Create an exact duplicate of this node and return it. The memory must be deleted by the caller. */ virtual TiXmlNode* Clone() const = 0; /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the XML tree will be conditionally visited and the host will be called back via the TiXmlVisitor interface. This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse the XML for the callbacks, so the performance of TinyXML is unchanged by using this interface versus any other.) The interface has been based on ideas from: - http://www.saxproject.org/ - http://c2.com/cgi/wiki?HierarchicalVisitorPattern Which are both good references for "visiting". An example of using Accept(): @verbatim TiXmlPrinter printer; tinyxmlDoc.Accept( &printer ); const char* xmlcstr = printer.CStr(); @endverbatim */ virtual bool Accept( TiXmlVisitor* visitor ) const = 0; protected: TiXmlNode( NodeType _type ); // Copy to the allocated object. Shared functionality between Clone, Copy constructor, // and the assignment operator. void CopyTo( TiXmlNode* target ) const; #ifdef TIXML_USE_STL // The real work of the input operator. virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; #endif // Figure out what is at *p, and parse it. Returns null if it is not an xml node. TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); TiXmlNode* parent; NodeType type; TiXmlNode* firstChild; TiXmlNode* lastChild; TIXML_STRING value; TiXmlNode* prev; TiXmlNode* next; private: TiXmlNode( const TiXmlNode& ); // not implemented. void operator=( const TiXmlNode& base ); // not allowed. }; /** An attribute is a name-value pair. Elements have an arbitrary number of attributes, each with a unique name. @note The attributes are not TiXmlNodes, since they are not part of the tinyXML document object model. There are other suggested ways to look at this problem. */ class TiXmlAttribute : public TiXmlBase { friend class TiXmlAttributeSet; public: /// Construct an empty attribute. TiXmlAttribute() : TiXmlBase() { document = 0; prev = next = 0; } #ifdef TIXML_USE_STL /// std::string constructor. TiXmlAttribute( const std::string& _name, const std::string& _value ) { name = _name; value = _value; document = 0; prev = next = 0; } #endif /// Construct an attribute with a name and value. TiXmlAttribute( const char * _name, const char * _value ) { name = _name; value = _value; document = 0; prev = next = 0; } const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. #ifdef TIXML_USE_STL const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. #endif int IntValue() const; ///< Return the value of this attribute, converted to an integer. double DoubleValue() const; ///< Return the value of this attribute, converted to a double. // Get the tinyxml string representation const TIXML_STRING& NameTStr() const { return name; } /** QueryIntValue examines the value string. It is an alternative to the IntValue() method with richer error checking. If the value is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. A specialized but useful call. Note that for success it returns 0, which is the opposite of almost all other TinyXml calls. */ int QueryIntValue( int* _value ) const; /// QueryDoubleValue examines the value string. See QueryIntValue(). int QueryDoubleValue( double* _value ) const; void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. void SetValue( const char* _value ) { value = _value; } ///< Set the value. void SetIntValue( int _value ); ///< Set the value from an integer. void SetDoubleValue( double _value ); ///< Set the value from a double. #ifdef TIXML_USE_STL /// STL std::string form. void SetName( const std::string& _name ) { name = _name; } /// STL std::string form. void SetValue( const std::string& _value ) { value = _value; } #endif /// Get the next sibling attribute in the DOM. Returns null at end. const TiXmlAttribute* Next() const; TiXmlAttribute* Next() { return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); } /// Get the previous sibling attribute in the DOM. Returns null at beginning. const TiXmlAttribute* Previous() const; TiXmlAttribute* Previous() { return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); } bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } /* Attribute parsing starts: first letter of the name returns: the next char after the value end quote */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); // Prints this Attribute to a FILE stream. virtual void Print( FILE* cfile, int depth ) const { Print( cfile, depth, 0 ); } void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; // [internal use] // Set the document pointer so the attribute can report errors. void SetDocument( TiXmlDocument* doc ) { document = doc; } private: TiXmlAttribute( const TiXmlAttribute& ); // not implemented. void operator=( const TiXmlAttribute& base ); // not allowed. TiXmlDocument* document; // A pointer back to a document, for error reporting. TIXML_STRING name; TIXML_STRING value; TiXmlAttribute* prev; TiXmlAttribute* next; }; /* A class used to manage a group of attributes. It is only used internally, both by the ELEMENT and the DECLARATION. The set can be changed transparent to the Element and Declaration classes that use it, but NOT transparent to the Attribute which has to implement a next() and previous() method. Which makes it a bit problematic and prevents the use of STL. This version is implemented with circular lists because: - I like circular lists - it demonstrates some independence from the (typical) doubly linked list. */ class TiXmlAttributeSet { public: TiXmlAttributeSet(); ~TiXmlAttributeSet(); void Add( TiXmlAttribute* attribute ); void Remove( TiXmlAttribute* attribute ); const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } TiXmlAttribute* Find( const char* _name ) const; TiXmlAttribute* FindOrCreate( const char* _name ); # ifdef TIXML_USE_STL TiXmlAttribute* Find( const std::string& _name ) const; TiXmlAttribute* FindOrCreate( const std::string& _name ); # endif private: //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), //*ME: this class must be also use a hidden/disabled copy-constructor !!! TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) TiXmlAttribute sentinel; }; /** The element is a container class. It has a value, the element name, and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes. */ class TiXmlElement : public TiXmlNode { public: /// Construct an element. TiXmlElement (const char * in_value); #ifdef TIXML_USE_STL /// std::string constructor. TiXmlElement( const std::string& _value ); #endif TiXmlElement( const TiXmlElement& ); TiXmlElement& operator=( const TiXmlElement& base ); virtual ~TiXmlElement(); /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. */ const char* Attribute( const char* name ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. If the attribute exists and can be converted to an integer, the integer value will be put in the return 'i', if 'i' is non-null. */ const char* Attribute( const char* name, int* i ) const; /** Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists. If the attribute exists and can be converted to an double, the double value will be put in the return 'd', if 'd' is non-null. */ const char* Attribute( const char* name, double* d ) const; /** QueryIntAttribute examines the attribute - it is an alternative to the Attribute() method with richer error checking. If the attribute is an integer, it is stored in 'value' and the call returns TIXML_SUCCESS. If it is not an integer, it returns TIXML_WRONG_TYPE. If the attribute does not exist, then TIXML_NO_ATTRIBUTE is returned. */ int QueryIntAttribute( const char* name, int* _value ) const; /// QueryUnsignedAttribute examines the attribute - see QueryIntAttribute(). int QueryUnsignedAttribute( const char* name, unsigned* _value ) const; /** QueryBoolAttribute examines the attribute - see QueryIntAttribute(). Note that '1', 'true', or 'yes' are considered true, while '0', 'false' and 'no' are considered false. */ int QueryBoolAttribute( const char* name, bool* _value ) const; /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). int QueryDoubleAttribute( const char* name, double* _value ) const; /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). int QueryFloatAttribute( const char* name, float* _value ) const { double d; int result = QueryDoubleAttribute( name, &d ); if ( result == TIXML_SUCCESS ) { *_value = (float)d; } return result; } #ifdef TIXML_USE_STL /// QueryStringAttribute examines the attribute - see QueryIntAttribute(). int QueryStringAttribute( const char* name, std::string* _value ) const { const char* cstr = Attribute( name ); if ( cstr ) { *_value = std::string( cstr ); return TIXML_SUCCESS; } return TIXML_NO_ATTRIBUTE; } /** Template form of the attribute query which will try to read the attribute into the specified type. Very easy, very powerful, but be careful to make sure to call this with the correct type. NOTE: This method doesn't work correctly for 'string' types that contain spaces. @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE */ template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; std::stringstream sstream( node->ValueStr() ); sstream >> *outValue; if ( !sstream.fail() ) return TIXML_SUCCESS; return TIXML_WRONG_TYPE; } int QueryValueAttribute( const std::string& name, std::string* outValue ) const { const TiXmlAttribute* node = attributeSet.Find( name ); if ( !node ) return TIXML_NO_ATTRIBUTE; *outValue = node->ValueStr(); return TIXML_SUCCESS; } #endif /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const char* name, const char * _value ); #ifdef TIXML_USE_STL const std::string* Attribute( const std::string& name ) const; const std::string* Attribute( const std::string& name, int* i ) const; const std::string* Attribute( const std::string& name, double* d ) const; int QueryIntAttribute( const std::string& name, int* _value ) const; int QueryDoubleAttribute( const std::string& name, double* _value ) const; /// STL std::string form. void SetAttribute( const std::string& name, const std::string& _value ); ///< STL std::string form. void SetAttribute( const std::string& name, int _value ); ///< STL std::string form. void SetDoubleAttribute( const std::string& name, double value ); #endif /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const char * name, int value ); /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetDoubleAttribute( const char * name, double value ); /** Deletes an attribute with the given name. */ void RemoveAttribute( const char * name ); #ifdef TIXML_USE_STL void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. #endif const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } /** Convenience function for easy access to the text inside an element. Although easy and concise, GetText() is limited compared to getting the TiXmlText child and accessing it directly. If the first child of 'this' is a TiXmlText, the GetText() returns the character string of the Text node, else null is returned. This is a convenient method for getting the text of simple contained text: @verbatim This is text const char* str = fooElement->GetText(); @endverbatim 'str' will be a pointer to "This is text". Note that this function can be misleading. If the element foo was created from this XML: @verbatim This is text @endverbatim then the value of str would be null. The first child node isn't a text node, it is another element. From this XML: @verbatim This is text @endverbatim GetText() will return "This is ". WARNING: GetText() accesses a child node - don't become confused with the similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are safe type casts on the referenced node. */ const char* GetText() const; /// Creates a new Element and returns it - the returned element is a copy. virtual TiXmlNode* Clone() const; // Print the Element to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /* Attribtue parsing starts: next char past '<' returns: next char past '>' */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlElement* target ) const; void ClearThis(); // like clear, but initializes 'this' object as well // Used to be public [internal use] #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif /* [internal use] Reads the "value" of the element -- another element, or text. This should terminate with the current end tag. */ const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); private: TiXmlAttributeSet attributeSet; }; /** An XML comment. */ class TiXmlComment : public TiXmlNode { public: /// Constructs an empty comment. TiXmlComment() : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) {} /// Construct a comment from text. TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::TINYXML_COMMENT ) { SetValue( _value ); } TiXmlComment( const TiXmlComment& ); TiXmlComment& operator=( const TiXmlComment& base ); virtual ~TiXmlComment() {} /// Returns a copy of this Comment. virtual TiXmlNode* Clone() const; // Write this Comment to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /* Attribtue parsing starts: at the ! of the !-- returns: next char past '>' */ virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlComment* target ) const; // used to be public #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif // virtual void StreamOut( TIXML_OSTREAM * out ) const; private: }; /** XML text. A text node can have 2 ways to output the next. "normal" output and CDATA. It will default to the mode it was parsed from the XML file and you generally want to leave it alone, but you can change the output mode with SetCDATA() and query it with CDATA(). */ class TiXmlText : public TiXmlNode { friend class TiXmlElement; public: /** Constructor for text element. By default, it is treated as normal, encoded text. If you want it be output as a CDATA text element, set the parameter _cdata to 'true' */ TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) { SetValue( initValue ); cdata = false; } virtual ~TiXmlText() {} #ifdef TIXML_USE_STL /// Constructor. TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TINYXML_TEXT) { SetValue( initValue ); cdata = false; } #endif TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TINYXML_TEXT ) { copy.CopyTo( this ); } TiXmlText& operator=( const TiXmlText& base ) { base.CopyTo( this ); return *this; } // Write this text object to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; /// Queries whether this represents text using a CDATA section. bool CDATA() const { return cdata; } /// Turns on or off a CDATA representation of text. void SetCDATA( bool _cdata ) { cdata = _cdata; } virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected : /// [internal use] Creates a new Element and returns it. virtual TiXmlNode* Clone() const; void CopyTo( TiXmlText* target ) const; bool Blank() const; // returns true if all white space and new lines // [internal use] #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: bool cdata; // true if this should be input and output as a CDATA style text element }; /** In correct XML the declaration is the first entry in the file. @verbatim @endverbatim TinyXml will happily read or write files without a declaration, however. There are 3 possible attributes to the declaration: version, encoding, and standalone. Note: In this version of the code, the attributes are handled as special cases, not generic attributes, simply because there can only be at most 3 and they are always the same. */ class TiXmlDeclaration : public TiXmlNode { public: /// Construct an empty declaration. TiXmlDeclaration() : TiXmlNode( TiXmlNode::TINYXML_DECLARATION ) {} #ifdef TIXML_USE_STL /// Constructor. TiXmlDeclaration( const std::string& _version, const std::string& _encoding, const std::string& _standalone ); #endif /// Construct. TiXmlDeclaration( const char* _version, const char* _encoding, const char* _standalone ); TiXmlDeclaration( const TiXmlDeclaration& copy ); TiXmlDeclaration& operator=( const TiXmlDeclaration& copy ); virtual ~TiXmlDeclaration() {} /// Version. Will return an empty string if none was found. const char *Version() const { return version.c_str (); } /// Encoding. Will return an empty string if none was found. const char *Encoding() const { return encoding.c_str (); } /// Is this a standalone document? const char *Standalone() const { return standalone.c_str (); } /// Creates a copy of this Declaration and returns it. virtual TiXmlNode* Clone() const; // Print this declaration to a FILE stream. virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; virtual void Print( FILE* cfile, int depth ) const { Print( cfile, depth, 0 ); } virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* visitor ) const; protected: void CopyTo( TiXmlDeclaration* target ) const; // used to be public #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: TIXML_STRING version; TIXML_STRING encoding; TIXML_STRING standalone; }; /** Any tag that tinyXml doesn't recognize is saved as an unknown. It is a tag of text, but should not be modified. It will be written back to the XML, unchanged, when the file is saved. DTD tags get thrown into TiXmlUnknowns. */ class TiXmlUnknown : public TiXmlNode { public: TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) {} virtual ~TiXmlUnknown() {} TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN ) { copy.CopyTo( this ); } TiXmlUnknown& operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); return *this; } /// Creates a copy of this Unknown and returns it. virtual TiXmlNode* Clone() const; // Print this Unknown to a FILE stream. virtual void Print( FILE* cfile, int depth ) const; virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected: void CopyTo( TiXmlUnknown* target ) const; #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: }; /** Always the top level node. A document binds together all the XML pieces. It can be saved, loaded, and printed to the screen. The 'value' of a document node is the xml file name. */ class TiXmlDocument : public TiXmlNode { public: /// Create an empty document, that has no name. TiXmlDocument(); /// Create a document with a name. The name of the document is also the filename of the xml. TiXmlDocument( const char * documentName ); #ifdef TIXML_USE_STL /// Constructor. TiXmlDocument( const std::string& documentName ); #endif TiXmlDocument( const TiXmlDocument& copy ); TiXmlDocument& operator=( const TiXmlDocument& copy ); virtual ~TiXmlDocument() {} /** Load a file using the current document value. Returns true if successful. Will delete any existing document data before loading. */ bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the current document value. Returns true if successful. bool SaveFile() const; /// Load a file using the given filename. Returns true if successful. bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the given filename. Returns true if successful. bool SaveFile( const char * filename ) const; /** Load a file using the given FILE*. Returns true if successful. Note that this method doesn't stream - the entire object pointed at by the FILE* will be interpreted as an XML file. TinyXML doesn't stream in XML from the current file location. Streaming may be added in the future. */ bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /// Save a file using the given FILE*. Returns true if successful. bool SaveFile( FILE* ) const; #ifdef TIXML_USE_STL bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. { return LoadFile( filename.c_str(), encoding ); } bool SaveFile( const std::string& filename ) const ///< STL std::string version. { return SaveFile( filename.c_str() ); } #endif /** Parse the given null terminated block of xml data. Passing in an encoding to this method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml to use that encoding, regardless of what TinyXml might otherwise try to detect. */ virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); /** Get the root element -- the only top level element -- of the document. In well formed XML, there should only be one. TinyXml is tolerant of multiple elements at the document level. */ const TiXmlElement* RootElement() const { return FirstChildElement(); } TiXmlElement* RootElement() { return FirstChildElement(); } /** If an error occurs, Error will be set to true. Also, - The ErrorId() will contain the integer identifier of the error (not generally useful) - The ErrorDesc() method will return the name of the error. (very useful) - The ErrorRow() and ErrorCol() will return the location of the error (if known) */ bool Error() const { return error; } /// Contains a textual (english) description of the error if one occurs. const char * ErrorDesc() const { return errorDesc.c_str (); } /** Generally, you probably want the error string ( ErrorDesc() ). But if you prefer the ErrorId, this function will fetch it. */ int ErrorId() const { return errorId; } /** Returns the location (if known) of the error. The first column is column 1, and the first row is row 1. A value of 0 means the row and column wasn't applicable (memory errors, for example, have no row/column) or the parser lost the error. (An error in the error reporting, in that case.) @sa SetTabSize, Row, Column */ int ErrorRow() const { return errorLocation.row+1; } int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) to report the correct values for row and column. It does not change the output or input in any way. By calling this method, with a tab size greater than 0, the row and column of each node and attribute is stored when the file is loaded. Very useful for tracking the DOM back in to the source file. The tab size is required for calculating the location of nodes. If not set, the default of 4 is used. The tabsize is set per document. Setting the tabsize to 0 disables row/column tracking. Note that row and column tracking is not supported when using operator>>. The tab size needs to be enabled before the parse or load. Correct usage: @verbatim TiXmlDocument doc; doc.SetTabSize( 8 ); doc.Load( "myfile.xml" ); @endverbatim @sa Row, Column */ void SetTabSize( int _tabsize ) { tabsize = _tabsize; } int TabSize() const { return tabsize; } /** If you have handled the error, it can be reset with this call. The error state is automatically cleared if you Parse a new XML block. */ void ClearError() { error = false; errorId = 0; errorDesc = ""; errorLocation.row = errorLocation.col = 0; //errorLocation.last = 0; } /** Write the document to standard out using formatted printing ("pretty print"). */ void Print() const { Print( stdout, 0 ); } /* Write the document to a string using formatted printing ("pretty print"). This will allocate a character array (new char[]) and return it as a pointer. The calling code pust call delete[] on the return char* to avoid a memory leak. */ //char* PrintToMemory() const; /// Print this Document to a FILE stream. virtual void Print( FILE* cfile, int depth = 0 ) const; // [internal use] void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. /** Walk the XML tree visiting this node and all of its children. */ virtual bool Accept( TiXmlVisitor* content ) const; protected : // [internal use] virtual TiXmlNode* Clone() const; #ifdef TIXML_USE_STL virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); #endif private: void CopyTo( TiXmlDocument* target ) const; bool error; int errorId; TIXML_STRING errorDesc; int tabsize; TiXmlCursor errorLocation; bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. }; /** A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml DOM structure. It is a separate utility class. Take an example: @verbatim @endverbatim Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very easy to write a *lot* of code that looks like: @verbatim TiXmlElement* root = document.FirstChildElement( "Document" ); if ( root ) { TiXmlElement* element = root->FirstChildElement( "Element" ); if ( element ) { TiXmlElement* child = element->FirstChildElement( "Child" ); if ( child ) { TiXmlElement* child2 = child->NextSiblingElement( "Child" ); if ( child2 ) { // Finally do something useful. @endverbatim And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity of such code. A TiXmlHandle checks for null pointers so it is perfectly safe and correct to use: @verbatim TiXmlHandle docHandle( &document ); TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); if ( child2 ) { // do something useful @endverbatim Which is MUCH more concise and useful. It is also safe to copy handles - internally they are nothing more than node pointers. @verbatim TiXmlHandle handleCopy = handle; @endverbatim What they should not be used for is iteration: @verbatim int i=0; while ( true ) { TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); if ( !child ) break; // do something ++i; } @endverbatim It seems reasonable, but it is in fact two embedded while loops. The Child method is a linear walk to find the element, so this code would iterate much more than it needs to. Instead, prefer: @verbatim TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); for( child; child; child=child->NextSiblingElement() ) { // do something } @endverbatim */ class TiXmlHandle { public: /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } /// Copy constructor TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } TiXmlHandle operator=( const TiXmlHandle& ref ) { if ( &ref != this ) this->node = ref.node; return *this; } /// Return a handle to the first child node. TiXmlHandle FirstChild() const; /// Return a handle to the first child node with the given name. TiXmlHandle FirstChild( const char * value ) const; /// Return a handle to the first child element. TiXmlHandle FirstChildElement() const; /// Return a handle to the first child element with the given name. TiXmlHandle FirstChildElement( const char * value ) const; /** Return a handle to the "index" child with the given name. The first child is 0, the second 1, etc. */ TiXmlHandle Child( const char* value, int index ) const; /** Return a handle to the "index" child. The first child is 0, the second 1, etc. */ TiXmlHandle Child( int index ) const; /** Return a handle to the "index" child element with the given name. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( const char* value, int index ) const; /** Return a handle to the "index" child element. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted. */ TiXmlHandle ChildElement( int index ) const; #ifdef TIXML_USE_STL TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } #endif /** Return the handle as a TiXmlNode. This may return null. */ TiXmlNode* ToNode() const { return node; } /** Return the handle as a TiXmlElement. This may return null. */ TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } /** Return the handle as a TiXmlText. This may return null. */ TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } /** Return the handle as a TiXmlUnknown. This may return null. */ TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } /** @deprecated use ToNode. Return the handle as a TiXmlNode. This may return null. */ TiXmlNode* Node() const { return ToNode(); } /** @deprecated use ToElement. Return the handle as a TiXmlElement. This may return null. */ TiXmlElement* Element() const { return ToElement(); } /** @deprecated use ToText() Return the handle as a TiXmlText. This may return null. */ TiXmlText* Text() const { return ToText(); } /** @deprecated use ToUnknown() Return the handle as a TiXmlUnknown. This may return null. */ TiXmlUnknown* Unknown() const { return ToUnknown(); } private: TiXmlNode* node; }; /** Print to memory functionality. The TiXmlPrinter is useful when you need to: -# Print to memory (especially in non-STL mode) -# Control formatting (line endings, etc.) When constructed, the TiXmlPrinter is in its default "pretty printing" mode. Before calling Accept() you can call methods to control the printing of the XML document. After TiXmlNode::Accept() is called, the printed document can be accessed via the CStr(), Str(), and Size() methods. TiXmlPrinter uses the Visitor API. @verbatim TiXmlPrinter printer; printer.SetIndent( "\t" ); doc.Accept( &printer ); fprintf( stdout, "%s", printer.CStr() ); @endverbatim */ class TiXmlPrinter : public TiXmlVisitor { public: TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), buffer(), indent( " " ), lineBreak( "\n" ) {} virtual bool VisitEnter( const TiXmlDocument& doc ); virtual bool VisitExit( const TiXmlDocument& doc ); virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); virtual bool VisitExit( const TiXmlElement& element ); virtual bool Visit( const TiXmlDeclaration& declaration ); virtual bool Visit( const TiXmlText& text ); virtual bool Visit( const TiXmlComment& comment ); virtual bool Visit( const TiXmlUnknown& unknown ); /** Set the indent characters for printing. By default 4 spaces but tab (\t) is also useful, or null/empty string for no indentation. */ void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } /// Query the indention string. const char* Indent() { return indent.c_str(); } /** Set the line breaking string. By default set to newline (\n). Some operating systems prefer other characters, or can be set to the null/empty string for no indenation. */ void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } /// Query the current line breaking string. const char* LineBreak() { return lineBreak.c_str(); } /** Switch over to "stream printing" which is the most dense formatting without linebreaks. Common when the XML is needed for network transmission. */ void SetStreamPrinting() { indent = ""; lineBreak = ""; } /// Return the result. const char* CStr() { return buffer.c_str(); } /// Return the length of the result string. size_t Size() { return buffer.size(); } #ifdef TIXML_USE_STL /// Return the result. const std::string& Str() { return buffer; } #endif private: void DoIndent() { for( int i=0; i. */ #ifndef RDIRNODE_H #define RDIRNODE_H #include "core/sdlapp.h" #include "core/bounds.h" #include "core/quadtree.h" #include "core/pi.h" #include "core/vbo.h" #include "gource_settings.h" #include "spline.h" #include "file.h" #include "bloom.h" #include #include class RFile; class RDirNode : public QuadItem { std::string abspath; std::string path_token; int path_token_offset; RDirNode* parent; std::list children; std::list files; SplineEdge spline; vec4 col; vec2 spos; vec2 projected_pos; vec2 projected_spos; vec2 pos; vec2 vel; vec2 accel, prev_accel; float dir_area; bool visible; bool in_frustum; bool position_initialized; float since_node_visible; float since_last_file_change; float since_last_node_change; float file_area; float dir_radius; float dir_radius_sqrt; float parent_radius; int depth; int visible_count; vec3 screenpos; vec2 node_normal; void calcRadius(); void calcColour(); std::string commonPathPrefix(const std::string& str) const; void changePath(const std::string & abspath); void setInitialPosition(); void drawEdge(RDirNode* child) const; void updateSplinePoint(float dt); void move(float dt); vec2 calcFileDest(int layer_no, int file_no); void updateFilePositions(); void adjustDepth(); void adjustPath(); void drawDirName(FXFont& dirfont) const; public: RDirNode(RDirNode* parent, const std::string & abspath); ~RDirNode(); void printFiles(); bool empty() const; bool isAnchor(RDirNode* node) const; RDirNode* getRoot(); void fileUpdated(bool userInitiated); void nodeUpdated(bool userInitiated); void addVisible(); bool isVisible(); float getArea() const; int totalDirCount() const; int totalFileCount() const; int getTokenOffset() const; int dirCount() const; int fileCount() const; int visibleFileCount() const; bool noDirs() const; bool noFiles() const; bool prefixedBy(const std::string & path) const; const std::string & getPath() const; const vec2 & getNodeNormal() const; bool isParent(RDirNode* node) const; bool addFile(RFile* f); bool removeFile(RFile* f); int getDepth() const; const std::list & getChildren() const; void updateQuadItemBounds(); float getParentRadius() const; float getRadius() const; float getRadiusSqrt() const; const std::list* getFiles() const { return &files; }; void getFilesRecursive(std::list& files) const; vec3 averageFileColour() const; const vec4 & getColour() const; RDirNode* getParent() const; bool isDir(const std::string& path) const; void findDirs(const std::string& path, std::list& dirs); const vec2 & getPos() const; void calcEdges(); const vec2 & getProjectedPos() const; const vec2 & getSPos() const; void setPos(const vec2 & pos); void rotate(float s, float c); void rotate(float s, float c, const vec2& centre); void setParent(RDirNode* parent); float distanceToParent() const; void addNode(RDirNode* node); void debug(int indent=0) const; void applyForceDir(RDirNode* dir); void applyForces(QuadTree &quadtree); void logic(float dt); void updateEdgeVBO(quadbuf& buffer) const; void drawEdges() const; void drawEdgeShadows() const; void checkFrustum(const Frustum & frustum); void updateFilesVBO(quadbuf& buffer, float dt) const; void updateBloomVBO(bloombuf& buffer, float dt); void drawShadows(float dt) const; void drawFiles(float dt) const; void drawBloom(float dt); void drawNames(FXFont& dirfont); void calcScreenPos(GLint* viewport, GLdouble* modelview, GLdouble* projection); void nodeCount() const; }; class DirForceFunctor : public VisitFunctor{ private: RDirNode * this_dir; std::set seen; size_t loopCount; public: DirForceFunctor(RDirNode * dir) : this_dir(dir), seen(), loopCount(0){} int getLoopCount() const{ return loopCount; } void operator()(QuadItem * item){ std::set::iterator seentest; RDirNode* d = (RDirNode*) (item); if(d==this_dir) return; if(d==this_dir->getParent()) return; if(d->getParent() == this_dir) return; if(this_dir->isParent(d)) return; if(d->isParent(this_dir)) return; if(d->node_count != 1) { if((seentest = seen.find(d)) != seen.end()) return; seen.insert(d); } this_dir->applyForceDir(d); loopCount++; } }; extern int gGourceDirNodeInnerLoops; extern int gGourceFileInnerLoops; extern float gGourcePointSize; extern bool gGourceNodeDebug; extern bool gGourceGravity; extern float gGourceForceGravity; extern std::map gGourceDirMap; #endif gource-0.54/src/spline.h0000644002342600234260000000260414362112042015015 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef SPLINE_EDGE_H #define SPLINE_EDGE_H #include "core/display.h" #include "core/vectors.h" #include "core/pi.h" #include "pawn.h" #include class SplineEdge { std::vector spline_point; std::vector spline_colour; vec2 label_pos; void drawBeam(const vec2 & pos1, const vec4 & col1, const vec2 & pos2, const vec4 & col2, float radius, bool first) const; public: SplineEdge(); const vec2& getLabelPos() const; void update(const vec2& pos1, const vec4& col1, const vec2& pos2, const vec4& col2, const vec2& spos); void drawToVBO(quadbuf& buffer) const; void drawShadow() const; void draw() const; }; #endif gource-0.54/src/test/0000755002342600234260000000000014362112042014327 5ustar andrewcandrewcgource-0.54/src/test/datetime_tests.cpp0000644002342600234260000001103514362112042020051 0ustar andrewcandrewc/* Copyright (C) 2021 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "../main.h" #include "../gource_settings.h" #include #include BOOST_AUTO_TEST_CASE( parse_date_time_tests ) { time_t timestamp; BOOST_CHECK_EQUAL(putenv((char*)"TZ=UTC"), 0); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635724800); BOOST_CHECK_EQUAL(putenv((char*)"TZ=Pacific/Auckland"), 0); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635678000); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01Z", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635724800); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01+0", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635724800); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01+13", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635678000); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 +13", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635678000); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01+5:30", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635705000); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721260); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01Z", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635768060); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01+0", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635768060); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01+13", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721260); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01 +13", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721260); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01+5:30", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635748260); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01:59", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59.123", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01:59Z", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635768119); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01:59+0", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635768119); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01:59+13", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01:59 +13", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01 12:01:59+5:30", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635748319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59.123", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59Z", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635768119); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59+0", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635768119); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59+13", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59+13", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635721319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59+5:30", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635748319); BOOST_CHECK(SDLAppSettings::parseDateTime("2021-11-01T12:01:59.123+5:30", timestamp)); BOOST_CHECK_EQUAL(timestamp, 1635748319); } gource-0.54/src/test/main.cpp0000644002342600234260000000013114362112042015752 0ustar andrewcandrewc#define BOOST_TEST_MODULE Gource Test Suite #include gource-0.54/src/test/regex_tests.cpp0000644002342600234260000000300414362112042017364 0ustar andrewcandrewc/* Copyright (C) 2021 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "../core/regex.h" #include #include BOOST_AUTO_TEST_CASE( regex_tests ) { Regex regex("^[A-Z]+$"); BOOST_CHECK(regex.isValid()); BOOST_CHECK(regex.match("ABC")); BOOST_CHECK(regex.match("abc") == false); BOOST_CHECK(regex.match("ABC123") == false); Regex regex_copy = Regex("^[A-Z]+$"); BOOST_CHECK(regex_copy.isValid()); BOOST_CHECK(regex_copy.match("ABC")); BOOST_CHECK_THROW(Regex("^[A-Z+$"), RegexCompilationException); Regex test_regex("^[A-Z+$", true); BOOST_CHECK(test_regex.isValid() == false); std::vector matches; Regex capture_regex("([0-9]+)"); BOOST_CHECK(capture_regex.match("ABC123", &matches)); BOOST_CHECK_EQUAL(matches.size(), 1); BOOST_CHECK_EQUAL(matches[0], "123"); } gource-0.54/src/zoomcamera.h0000644002342600234260000000430614362112042015661 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef ZOOM_CAMERA_H #define ZOOM_CAMERA_H #include "core/bounds.h" #include "core/frustum.h" #include "gource_settings.h" class ZoomCamera { vec3 pos; vec3 dest; vec3 target; vec3 up; vec3 _pos; vec3 _target; bool lockon; float speed; float lockon_time; float padding; float min_distance, max_distance; float fov; float znear, zfar; public: ZoomCamera(); ZoomCamera(vec3 start, vec3 target, float min_distance, float max_distance); void setSpeed(float speed); void lockOn(bool lockon); void look(); void lookAt(const vec3& target); void focus(); const vec3& getPos() const { return pos; }; const vec3& getUp() const { return up; }; const vec3& getTarget() const { return target; }; const vec3& getDest() const { return dest; }; float getFOV() { return fov; }; float getZNear() { return znear; }; float getZFar() { return zfar; }; void setPos(const vec3& pos, bool keep_angle = false); float getMinDistance(); float getMaxDistance(); void setPadding(float padding); void setDistance(float distance); void setMinDistance(float min); void setMaxDistance(float max); void reset(); void logic(float dt); void adjustDistance(); void adjust(const Bounds2D& bounds); void adjust(const Bounds2D& bounds, bool adjust_distance); void stop(); }; extern bool gGourceVerticalCrop; extern bool gGourceHorizontalCrop; #endif gource-0.54/src/main.cpp0000644002342600234260000001557014362112042015010 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "main.h" int main(int argc, char *argv[]) { std::string exepath; #ifndef _WIN32 if(argc > 0) { exepath = std::string(argv[0]); } #endif SDLAppInit("Gource", "gource", exepath); #ifdef _WIN32 SDLApp::initConsole(); #endif ConfFile conf; std::vector files; //convert args to a conf file //read the conf file //apply the conf file to settings try { gGourceSettings.parseArgs(argc, argv, conf, &files); if(gGourceSettings.load_config.empty() && !files.empty()) { //see if file looks like a config file for(std::vector::iterator fit = files.begin(); fit != files.end(); fit++) { std::string file = *fit; int file_length = file.size(); if( (file.rfind(".conf") == (file_length-5) && file_length > 5) || (file.rfind(".cfg") == (file_length-4) && file_length > 4) || (file.rfind(".ini") == (file_length-4) && file_length > 4) ) { bool is_conf=true; try { ConfFile conftest; conftest.load(file); } catch(ConfFileException& exception) { is_conf = false; } if(is_conf) { gGourceSettings.load_config = file; files.erase(fit); break; } } } } //set log level Logger::getDefault()->setLevel(gGourceSettings.log_level); #ifdef _WIN32 // hide console if not needed if(gGourceSettings.log_level == LOG_LEVEL_OFF && !SDLApp::existing_console) { SDLApp::showConsole(false); } #endif //load config if(!gGourceSettings.load_config.empty()) { conf.clear(); conf.load(gGourceSettings.load_config); //apply args to loaded conf file gGourceSettings.parseArgs(argc, argv, conf); } //set path if(!files.empty()) { std::string path = files[files.size()-1]; ConfSectionList* sectionlist = conf.getSections("gource"); if(sectionlist!=0) { for(ConfSectionList::iterator sit = sectionlist->begin(); sit != sectionlist->end(); sit++) { (*sit)->setEntry("path", path); } } else { conf.setEntry("gource", "path", path); } } //apply the config / see if its valid gGourceSettings.importDisplaySettings(conf); gGourceSettings.importGourceSettings(conf); //save config if(!gGourceSettings.save_config.empty()) { conf.save(gGourceSettings.save_config); exit(0); } //write custom log file if(!gGourceSettings.output_custom_filename.empty() && !gGourceSettings.path.empty()) { Gource::writeCustomLog(gGourceSettings.path, gGourceSettings.output_custom_filename); exit(0); } } catch(ConfFileException& exception) { SDLAppQuit(exception.what()); } //enable frameless display.enableFrameless(gGourceSettings.frameless); // this causes corruption on some video drivers if(gGourceSettings.multisample) { display.multiSample(4); } //background needs alpha channel if(gGourceSettings.transparent) { display.enableAlpha(true); } //enable vsync display.enableVsync(gGourceSettings.vsync); //allow resizing window if we are not recording if(gGourceSettings.resizable && gGourceSettings.output_ppm_filename.empty()) { display.enableResize(true); } // Change OS High DPI display behaviour // On Windows this behaves differently, it seems safe to always enable it bool high_dpi = true; #ifndef _WIN32 // Requesting High DPI on MacOS may cause the pixel resolution to be doubled. // If a resolution has been specified this may not be appropriate // E.g. if you are recording a video at a specific resolution // Can override by supplying --high-dpi option. if(gGourceSettings.viewport_specified && !gGourceSettings.high_dpi) { high_dpi = false; } #endif display.enableHighDPIAwareness(high_dpi); try { display.init("Gource", gGourceSettings.display_width, gGourceSettings.display_height, gGourceSettings.fullscreen, gGourceSettings.screen); #if SDL_VERSION_ATLEAST(2,0,0) if(!display.isFullscreen() && gGourceSettings.window_x >= 0 && gGourceSettings.window_y >= 0) { SDL_SetWindowPosition(display.sdl_window, gGourceSettings.window_x, gGourceSettings.window_y); } SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); #endif } catch(SDLInitException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "SDL initialization failed - %s", exception.what()); SDLAppQuit(errormsg); } //init frame exporter FrameExporter* exporter = 0; if(gGourceSettings.output_ppm_filename.size() > 0) { try { exporter = new PPMExporter(gGourceSettings.output_ppm_filename); } catch(PPMExporterException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "could not write to '%s'", exception.what()); SDLAppQuit(errormsg); } } if(display.multiSamplingEnabled()) { glEnable(GL_MULTISAMPLE_ARB); } GourceShell* gourcesh = 0; try { gourcesh = gGourceShell = new GourceShell(&conf, exporter); gourcesh->run(); } catch(ResourceException& exception) { char errormsg[1024]; snprintf(errormsg, 1024, "failed to load resource '%s'", exception.what()); SDLAppQuit(errormsg); } catch(SDLAppException& exception) { if(exception.showHelp()) { gGourceSettings.help(); } else { SDLAppQuit(exception.what()); } } gGourceShell = 0; if(gourcesh != 0) delete gourcesh; if(exporter != 0) delete exporter; //free resources display.quit(); return 0; } gource-0.54/src/logmill.cpp0000644002342600234260000002102114362112042015507 0ustar andrewcandrewc/* Copyright (C) 2012 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "logmill.h" #include "gource_settings.h" #include "formats/git.h" #include "formats/gitraw.h" #include "formats/custom.h" #include "formats/hg.h" #include "formats/bzr.h" #include "formats/svn.h" #include "formats/apache.h" #include "formats/cvs-exp.h" #include "formats/cvs2cl.h" #include extern "C" { static int logmill_thread(void *lmill) { RLogMill *logmill = static_cast (lmill); logmill->run(); return 0; } }; RLogMill::RLogMill(const std::string& logfile) : logfile(logfile) { logmill_thread_state = LOGMILL_STATE_STARTUP; clog = 0; #if SDL_VERSION_ATLEAST(2,0,0) thread = SDL_CreateThread( logmill_thread, "logmill", this ); #else thread = SDL_CreateThread( logmill_thread, this ); #endif } RLogMill::~RLogMill() { abort(); if(clog) delete clog; } void RLogMill::run() { logmill_thread_state = LOGMILL_STATE_FETCHING; #if defined(HAVE_PTHREAD) && !defined(_WIN32) sigset_t mask; sigemptyset(&mask); // unblock SIGINT so user can cancel // NOTE: assumes SDL is using pthreads sigaddset(&mask, SIGINT); pthread_sigmask(SIG_UNBLOCK, &mask, 0); #endif std::string log_format = gGourceSettings.log_format; try { clog = fetchLog(log_format); // find first commit after start_timestamp if specified if(clog != 0 && gGourceSettings.start_timestamp != 0) { RCommit commit; while(!gGourceSettings.shutdown && !clog->isFinished()) { if(clog->nextCommit(commit) && commit.timestamp >= gGourceSettings.start_timestamp) { clog->bufferCommit(commit); break; } } } } catch(SeekLogException& exception) { error = "unable to read log file"; } catch(SDLAppException& exception) { error = exception.what(); } if(!clog && error.empty()) { if(boost::filesystem::is_directory(logfile)) { if(!log_format.empty()) { if(gGourceSettings.start_timestamp || gGourceSettings.stop_timestamp) { error = "failed to generate log file for the specified time period"; } else { error = "failed to generate log file"; } #ifdef _WIN32 // no error - should trigger help message } else if(gGourceSettings.default_path && boost::filesystem::exists("./gource.exe")) { error = ""; #endif } else { error = "directory not supported"; } } else { error = "unsupported log format (you may need to regenerate your log file)"; } } logmill_thread_state = clog ? LOGMILL_STATE_SUCCESS : LOGMILL_STATE_FAILURE; } void RLogMill::abort() { if(!thread) return; // TODO: make abort nicer by notifying the log process // we want to shutdown SDL_WaitThread(thread, 0); thread = 0; } bool RLogMill::isFinished() { return logmill_thread_state > LOGMILL_STATE_FETCHING; } int RLogMill::getStatus() { return logmill_thread_state; } std::string RLogMill::getError() { return error; } RCommitLog* RLogMill::getLog() { if(thread != 0) { SDL_WaitThread(thread, 0); thread = 0; } return clog; } bool RLogMill::findRepository(boost::filesystem::path& dir, std::string& log_format) { dir = canonical(dir); //fprintf(stderr, "find repository from initial path: %s\n", dir.string().c_str()); while(is_directory(dir)) { if(is_directory(dir / ".git") || is_regular_file(dir / ".git")) log_format = "git"; else if(is_directory(dir / ".hg")) log_format = "hg"; else if(is_directory(dir / ".bzr")) log_format = "bzr"; else if(is_directory(dir / ".svn")) log_format = "svn"; if(!log_format.empty()) { //fprintf(stderr, "found '%s' repository at: %s\n", log_format.c_str(), dir.string().c_str()); return true; } if(!dir.has_parent_path()) return false; dir = dir.parent_path(); } return false; } RCommitLog* RLogMill::fetchLog(std::string& log_format) { RCommitLog* clog = 0; //if the log format is not specified and 'logfile' is a directory, recursively look for a version control repository. //this method allows for something strange like someone who having an svn repository inside a git repository //(in which case it would pick the svn directory as it would encounter that first) if(log_format.empty() && logfile != "-") { try { boost::filesystem::path repo_path(logfile); if(is_directory(repo_path)) { if(findRepository(repo_path, log_format)) { logfile = repo_path.string(); } } } catch(boost::filesystem::filesystem_error& error) { } } //we've been told what format to use if(log_format.size() > 0) { debugLog("log-format = %s", log_format.c_str()); if(log_format == "git") { clog = new GitCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; clog = new GitRawCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; } if(log_format == "hg") { clog = new MercurialLog(logfile); if(clog->checkFormat()) return clog; delete clog; } if(log_format == "bzr") { clog = new BazaarLog(logfile); if(clog->checkFormat()) return clog; delete clog; } if(log_format == "cvs") { clog = new CVSEXPCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; } if(log_format == "custom") { clog = new CustomLog(logfile); if(clog->checkFormat()) return clog; delete clog; } if(log_format == "apache") { clog = new ApacheCombinedLog(logfile); if(clog->checkFormat()) return clog; delete clog; } if(log_format == "svn") { clog = new SVNCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; } if(log_format == "cvs2cl") { clog = new CVS2CLCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; } return 0; } // try different formats until one works //git debugLog("trying git..."); clog = new GitCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; //mercurial debugLog("trying mercurial..."); clog = new MercurialLog(logfile); if(clog->checkFormat()) return clog; delete clog; //bzr debugLog("trying bzr..."); clog = new BazaarLog(logfile); if(clog->checkFormat()) return clog; delete clog; //git raw debugLog("trying git raw..."); clog = new GitRawCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; //cvs exp debugLog("trying cvs-exp..."); clog = new CVSEXPCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; //svn debugLog("trying svn..."); clog = new SVNCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; //cvs2cl debugLog("trying cvs2cl..."); clog = new CVS2CLCommitLog(logfile); if(clog->checkFormat()) return clog; delete clog; //custom debugLog("trying custom..."); clog = new CustomLog(logfile); if(clog->checkFormat()) return clog; delete clog; //apache debugLog("trying apache combined..."); clog = new ApacheCombinedLog(logfile); if(clog->checkFormat()) return clog; delete clog; return 0; } gource-0.54/src/caption.cpp0000644002342600234260000000321614362112042015513 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "caption.h" RCaption::RCaption(const std::string& caption, time_t timestamp, const FXFont& font) { this->caption = caption; this->timestamp = timestamp; this->font = font; alpha = 0.0; elapsed = 0.0; colour = gGourceSettings.caption_colour; } void RCaption::setPos(const vec2& pos) { this->pos = pos; } const vec2& RCaption::getPos() const { return pos; } const std::string& RCaption::getCaption() const { return caption; } bool RCaption::isFinished() const { return elapsed >= gGourceSettings.caption_duration; } void RCaption::logic(float dt) { float fade_in = glm::min(2.0f, gGourceSettings.caption_duration / 3.0f); elapsed += dt; alpha = glm::min(1.0f, glm::min(elapsed,glm::max(0.0f,gGourceSettings.caption_duration-elapsed)) / fade_in); } void RCaption::draw() { font.setColour(vec4(colour.x, colour.y, colour.z, alpha)); font.draw(pos.x, pos.y, caption); } gource-0.54/src/file.cpp0000644002342600234260000001641414362112042015001 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "file.h" float gGourceFileDiameter = 8.0; std::vector gGourceRemovedFiles; FXFont file_selected_font; FXFont file_font; RFile::RFile(const std::string & name, const vec3 & colour, const vec2 & pos, int tagid) : Pawn(name,pos,tagid) { hidden = true; size = gGourceFileDiameter * 1.05; radius = size * 0.5; setGraphic(gGourceSettings.file_graphic); speed = 5.0; nametime = gGourceSettings.filename_time; name_interval = nametime; namecol = vec3(1.0, 1.0, 1.0); file_colour = colour; last_action = 0.0f; fade_start = -1.0f; removed_timestamp = 0; expired = false; forced_removal = false; removing = false; shadow = true; distance = 0; setFilename(name); if(!file_selected_font.initialized()) { file_selected_font = fontmanager.grab(gGourceSettings.font_file, 18); file_selected_font.dropShadow(true); file_selected_font.roundCoordinates(false); file_selected_font.setColour(vec4(gGourceSettings.selection_colour, 1.0f)); } if(!file_font.initialized()) { file_font = fontmanager.grab(gGourceSettings.font_file, gGourceSettings.scaled_filename_font_size); file_font.dropShadow(true); file_font.roundCoordinates(false); file_font.setColour(vec4(gGourceSettings.filename_colour, 1.0f)); } setSelected(false); dir = 0; } RFile::~RFile() { } void RFile::remove(time_t removed_timestamp) { last_action = elapsed; fade_start = elapsed; removing = true; this->removed_timestamp = removed_timestamp; } void RFile::remove() { forced_removal = true; remove(0); } void RFile::setDir(RDirNode* dir) { this->dir = dir; } RDirNode* RFile::getDir() const{ return dir; } vec2 RFile::getAbsolutePos() const{ return pos + dir->getPos(); } bool RFile::overlaps(const vec2& pos) const { vec2 abs_pos = getAbsolutePos(); float halfsize_x = size * 0.5f; vec2 halfsize ( halfsize_x, halfsize_x * graphic_ratio ); Bounds2D file_bounds(abs_pos - halfsize, abs_pos + halfsize); return file_bounds.contains(pos); } void RFile::setFilename(const std::string& abs_file_path) { fullpath = abs_file_path; size_t pos = fullpath.rfind('/'); if(pos != std::string::npos) { path = name.substr(0,pos+1); name = name.substr(pos+1, std::string::npos); } else { path = std::string(""); name = abs_file_path; } //trim name to just extension size_t dotsep = name.rfind("."); if(dotsep != std::string::npos && dotsep != name.size()-1) { ext = name.substr(dotsep+1); } else if(gGourceSettings.file_extension_fallback) { ext = name; } } void RFile::colourize() { file_colour = ext.size() ? colourHash(ext) : vec3(1.0f, 1.0f, 1.0f); } const vec3& RFile::getNameColour() const{ return selected ? gGourceSettings.selection_colour : namecol; } void RFile::setFileColour(const vec3 & colour) { file_colour = colour; } const vec3 & RFile::getFileColour() const{ return file_colour; } vec3 RFile::getColour() const{ if(selected) return vec3(1.0f); float lc = elapsed - last_action; if(lc<1.0f) { return touch_colour * (1.0f-lc) + file_colour * lc; } return file_colour; } float RFile::getAlpha() const{ float alpha = Pawn::getAlpha(); //user fades out if not doing anything if(fade_start > 0.0f) { alpha = 1.0 - glm::clamp(elapsed - fade_start, 0.0f, 1.0f); } return alpha; } void RFile::logic(float dt) { Pawn::logic(dt); vec2 dest_pos = dest; /* if(dir->getParent() != 0 && dir->noDirs()) { vec2 dirnorm = dir->getNodeNormal(); dest_pos = dirnorm + dest; }*/ dest_pos = dest_pos * distance; accel = dest_pos - pos; // apply accel vec2 accel2 = accel * speed * dt; if(glm::length2(accel2) > glm::length2(accel)) { accel2 = accel; } pos += accel2; //files have no momentum accel = vec2(0.0f, 0.0f); if(fade_start < 0.0f && gGourceSettings.file_idle_time > 0.0f && (elapsed - last_action) > gGourceSettings.file_idle_time) { fade_start = elapsed; } // has completely faded out if(fade_start > 0.0f && !expired && (elapsed - fade_start) >= 1.0) { expired = true; bool found = false; for(std::vector::iterator it = gGourceRemovedFiles.begin(); it != gGourceRemovedFiles.end(); it++) { if((*it) == this) { found = true; break; } } if(!found) { gGourceRemovedFiles.push_back(this); //fprintf(stderr, "expiring %s\n", fullpath.c_str()); } } if(isHidden() && !forced_removal) elapsed = 0.0; } void RFile::touch(time_t touched_timestamp, const vec3 & colour) { if(forced_removal || (removing && touched_timestamp < removed_timestamp)) return; //fprintf(stderr, "touch %s\n", fullpath.c_str()); fade_start = -1.0f; removing = false; removed_timestamp = 0; last_action = elapsed; touch_colour = colour; //un expire file if touched after being removed if(expired) { for(std::vector::iterator it = gGourceRemovedFiles.begin(); it != gGourceRemovedFiles.end(); it++) { if((*it) == this) { gGourceRemovedFiles.erase(it); break; } } expired=false; } showName(); setHidden(false); dir->fileUpdated(true); } void RFile::setHidden(bool hidden) { if(this->hidden==true && hidden==false && dir !=0) { dir->addVisible(); } Pawn::setHidden(hidden); } void RFile::calcScreenPos(GLint* viewport, GLdouble* modelview, GLdouble* projection) { static GLdouble screen_x, screen_y, screen_z; vec2 text_pos = getAbsolutePos(); text_pos.x += 5.5f; if(selected) text_pos.y -= 2.0f; else text_pos.y -= 1.0f; gluProject( text_pos.x, text_pos.y, 0.0f, modelview, projection, viewport, &screen_x, &screen_y, &screen_z); screen_y = (float)viewport[3] - screen_y; screenpos.x = screen_x; screenpos.y = screen_y; } void RFile::drawNameText(float alpha) { if(!selected && alpha <= 0.01) return; float name_alpha = selected ? 1.0 : alpha; if(selected) { file_selected_font.draw(screenpos.x, screenpos.y, name); } else { file_font.setAlpha(name_alpha); file_font.draw(screenpos.x, screenpos.y, gGourceSettings.file_extensions ? ext : name); } } void RFile::draw(float dt) { Pawn::draw(dt); glLoadName(0); } gource-0.54/src/gource_settings.cpp0000644002342600234260000015353314362112042017272 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "gource_settings.h" #include "core/sdlapp.h" #include #include #include #include "core/utf8/utf8.h" #include #include "formats/hg.h" #include "formats/git.h" #include "formats/bzr.h" #include "formats/cvs-exp.h" #include "formats/cvs2cl.h" #include "formats/svn.h" #ifndef GOURCE_FONT_FILE #define GOURCE_FONT_FILE "FreeSans.ttf" #endif GourceSettings gGourceSettings; //display help message void GourceSettings::help(bool extended_help) { #ifdef _WIN32 //resize window to fit help message SDLApp::resizeConsole(1040); SDLApp::showConsole(true); #endif printf("Gource v%s\n", GOURCE_VERSION); printf("Usage: gource [options] [path]\n"); printf("\nOptions:\n"); printf(" -h, --help Help\n\n"); printf(" -WIDTHxHEIGHT, --viewport Set viewport size\n"); printf(" -f, --fullscreen Fullscreen\n"); printf(" --screen SCREEN Screen number\n"); printf(" --multi-sampling Enable multi-sampling\n"); #ifndef _WIN32 printf(" --high-dpi Request a high DPI display\n"); #endif printf(" --no-vsync Disable vsync\n\n"); printf(" --start-date 'YYYY-MM-DD hh:mm:ss +tz' Start at a date and optional time\n"); printf(" --stop-date 'YYYY-MM-DD hh:mm:ss +tz' Stop at a date and optional time\n\n"); printf(" -p, --start-position POSITION Start at some position (0.0-1.0 or 'random')\n"); printf(" --stop-position POSITION Stop at some position\n"); printf(" -t, --stop-at-time SECONDS Stop after a specified number of seconds\n"); printf(" --stop-at-end Stop at end of the log\n"); printf(" --dont-stop Keep running after the end of the log\n"); printf(" --loop Loop at the end of the log\n\n"); printf(" -a, --auto-skip-seconds SECONDS Auto skip to next entry if nothing happens\n"); printf(" for a number of seconds (default: 3)\n"); printf(" --disable-auto-skip Disable auto skip\n"); printf(" -s, --seconds-per-day SECONDS Speed in seconds per day (default: 10)\n"); printf(" --realtime Realtime playback speed\n"); printf(" --no-time-travel Use the time of the last commit if the\n"); printf(" time of a commit is in the past\n"); printf(" -c, --time-scale SCALE Change simulation time scale (default: 1.0)\n"); printf(" -e, --elasticity FLOAT Elasticity of nodes (default: 0.0)\n\n"); printf(" --key Show file extension key\n\n"); printf(" --user-image-dir DIRECTORY Dir containing images to use as avatars\n"); printf(" --default-user-image IMAGE Default user image file\n"); printf(" --fixed-user-size Use a fixed size throughout\n"); printf(" --colour-images Colourize user images\n\n"); printf(" -i, --file-idle-time SECONDS Time files remain idle (default: 0)\n"); printf(" --file-idle-time-at-end SECONDS Time files remain idle at end (default: 0)\n\n"); printf(" --max-files NUMBER Max number of files or 0 for no limit\n"); printf(" --max-file-lag SECONDS Max time files of a commit can take to appear\n\n"); printf(" --log-command VCS Show the VCS log command (git,svn,hg,bzr,cvs2cl)\n"); printf(" --log-format VCS Specify the log format (git,svn,hg,bzr,cvs2cl,custom)\n\n"); printf(" --load-config CONF_FILE Load a config file\n"); printf(" --save-config CONF_FILE Save a config file with the current options\n\n"); printf(" -o, --output-ppm-stream FILE Output PPM stream to a file ('-' for STDOUT)\n"); printf(" -r, --output-framerate FPS Framerate of output (25,30,60)\n\n"); if(extended_help) { printf("Extended Options:\n\n"); printf(" --window-position XxY Initial window position\n"); printf(" --frameless Frameless window\n\n"); printf(" --output-custom-log FILE Output a custom format log file ('-' for STDOUT).\n\n"); printf(" -b, --background-colour FFFFFF Background colour in hex\n"); printf(" --background-image IMAGE Set a background image\n\n"); printf(" --bloom-multiplier Adjust the amount of bloom (default: 1.0)\n"); printf(" --bloom-intensity Adjust the intensity of the bloom (default: 0.75)\n\n"); printf(" --camera-mode MODE Camera mode (overview,track)\n"); printf(" --crop AXIS Crop view on an axis (vertical,horizontal)\n"); printf(" --padding FLOAT Camera view padding (default: 1.1)\n\n"); printf(" --disable-auto-rotate Disable automatic camera rotation\n\n"); printf(" --disable-input Disable keyboard and mouse input\n\n"); printf(" --date-format FORMAT Specify display date string (strftime format)\n\n"); printf(" --font-file FILE Specify the font\n"); printf(" --font-scale SCALE Scale the size of all fonts\n"); printf(" --font-size SIZE Font size used by date and title\n"); printf(" --file-font-size SIZE Font size for filenames\n"); printf(" --dir-font-size SIZE Font size for directory names\n"); printf(" --user-font-size SIZE Font size for user names\n"); printf(" --font-colour FFFFFF Font colour used by date and title in hex\n\n"); printf(" --file-extensions Show filename extensions only\n"); printf(" --file-extension-fallback Use filename as extension if the extension\n"); printf(" is missing or empty\n\n"); printf(" --git-branch Get the git log of a particular branch\n\n"); printf(" --hide DISPLAY_ELEMENT bloom,date,dirnames,files,filenames,mouse,progress,\n"); printf(" root,tree,users,usernames\n\n"); printf(" --logo IMAGE Logo to display in the foreground\n"); printf(" --logo-offset XxY Offset position of the logo\n\n"); printf(" --loop-delay-seconds SECONDS Seconds to delay before looping (default: 3)\n\n"); printf(" --title TITLE Set a title\n\n"); printf(" --transparent Make the background transparent\n\n"); printf(" --user-filter REGEX Ignore usernames matching this regex\n"); printf(" --user-show-filter REGEX Show only usernames matching this regex\n\n"); printf(" --file-filter REGEX Ignore file paths matching this regex\n"); printf(" --file-show-filter REGEX Show only file paths matching this regex\n\n"); printf(" --user-friction SECONDS Change the rate users slow down (default: 0.67)\n"); printf(" --user-scale SCALE Change scale of users (default: 1.0)\n"); printf(" --max-user-speed UNITS Speed users can travel per second (default: 500)\n\n"); printf(" --follow-user USER Camera will automatically follow this user\n"); printf(" --highlight-dirs Highlight the names of all directories\n"); printf(" --highlight-user USER Highlight the names of a particular user\n"); printf(" --highlight-users Highlight the names of all users\n\n"); printf(" --highlight-colour Font colour for highlighted users in hex.\n"); printf(" --selection-colour Font colour for selected users and files.\n"); printf(" --filename-colour Font colour for filenames.\n"); printf(" --dir-colour Font colour for directories.\n\n"); printf(" --dir-name-depth DEPTH Draw names of directories down to a specific depth.\n"); printf(" --dir-name-position FLOAT Position along edge of the directory name\n"); printf(" (between 0.0 and 1.0, default is 0.5).\n\n"); printf(" --filename-time SECONDS Duration to keep filenames on screen (default: 4.0)\n\n"); printf(" --caption-file FILE Caption file\n"); printf(" --caption-size SIZE Caption font size\n"); printf(" --caption-colour FFFFFF Caption colour in hex\n"); printf(" --caption-duration SECONDS Caption duration (default: 10.0)\n"); printf(" --caption-offset X Caption horizontal offset\n\n"); printf(" --hash-seed SEED Change the seed of hash function.\n\n"); printf(" --path PATH\n\n"); } printf("PATH may be a supported version control directory, a log file, a gource config\n"); printf("file, or '-' to read STDIN. If omitted, gource will attempt to generate a log\n"); printf("from the current directory.\n\n"); if(!extended_help) { printf("To see the full command line options use '-H'\n\n"); } #ifdef _WIN32 if(!SDLApp::existing_console) { printf("Press Enter\n"); getchar(); } #endif exit(0); } GourceSettings::GourceSettings() { repo_count = 0; file_graphic = 0; log_level = LOG_LEVEL_OFF; shutdown = false; setGourceDefaults(); default_section_name = "gource"; //translate args arg_aliases["p"] = "start-position"; arg_aliases["a"] = "auto-skip-seconds"; arg_aliases["s"] = "seconds-per-day"; arg_aliases["t"] = "stop-at-time"; arg_aliases["i"] = "file-idle-time"; arg_aliases["e"] = "elasticity"; arg_aliases["h"] = "help"; arg_aliases["?"] = "help"; arg_aliases["H"] = "extended-help"; arg_aliases["b"] = "background-colour"; arg_aliases["c"] = "time-scale"; arg_aliases["background"] = "background-colour"; arg_aliases["disable-bloom"] = "hide-bloom"; arg_aliases["disable-progress"] = "hide-progress"; arg_aliases["highlight-all-users"] = "highlight-users"; //command line only options conf_sections["help"] = "command-line"; conf_sections["extended-help"] = "command-line"; conf_sections["log-command"] = "command-line"; conf_sections["git-log-command"] = "command-line"; conf_sections["cvs-exp-command"] = "command-line"; conf_sections["cvs2cl-command"] = "command-line"; conf_sections["hg-log-command"] = "command-line"; conf_sections["bzr-log-command"] = "command-line"; conf_sections["svn-log-command"] = "command-line"; conf_sections["load-config"] = "command-line"; conf_sections["save-config"] = "command-line"; conf_sections["output-custom-log"] = "command-line"; conf_sections["log-level"] = "command-line"; //boolean args arg_types["help"] = "bool"; arg_types["extended-help"] = "bool"; arg_types["stop-on-idle"] = "bool"; arg_types["stop-at-end"] = "bool"; arg_types["dont-stop"] = "bool"; arg_types["loop"] = "bool"; arg_types["realtime"] = "bool"; arg_types["no-time-travel"] = "bool"; arg_types["colour-images"] = "bool"; arg_types["hide-date"] = "bool"; arg_types["hide-files"] = "bool"; arg_types["hide-users"] = "bool"; arg_types["hide-tree"] = "bool"; arg_types["hide-usernames"] = "bool"; arg_types["hide-filenames"] = "bool"; arg_types["hide-dirnames"] = "bool"; arg_types["hide-progress"] = "bool"; arg_types["hide-bloom"] = "bool"; arg_types["hide-mouse"] = "bool"; arg_types["hide-root"] = "bool"; arg_types["highlight-users"] = "bool"; arg_types["highlight-dirs"] = "bool"; arg_types["file-extensions"] = "bool"; arg_types["file-extension-fallback"] = "bool"; arg_types["fixed-user-size"] = "bool"; arg_types["key"] = "bool"; arg_types["ffp"] = "bool"; arg_types["disable-auto-rotate"] = "bool"; arg_types["disable-auto-skip"] = "bool"; arg_types["disable-input"] = "bool"; arg_types["git-log-command"]= "bool"; arg_types["cvs-exp-command"]= "bool"; arg_types["cvs2cl-command"] = "bool"; arg_types["svn-log-command"]= "bool"; arg_types["hg-log-command"] = "bool"; arg_types["bzr-log-command"]= "bool"; arg_types["bloom-intensity"] = "float"; arg_types["bloom-multiplier"] = "float"; arg_types["elasticity"] = "float"; arg_types["seconds-per-day"] = "float"; arg_types["auto-skip-seconds"] = "float"; arg_types["stop-at-time"] = "float"; arg_types["max-user-speed"] = "float"; arg_types["user-friction"] = "float"; arg_types["padding"] = "float"; arg_types["time-scale"] = "float"; arg_types["dir-name-position"] = "float"; arg_types["loop-delay-seconds"] = "float"; arg_types["max-files"] = "int"; arg_types["font-size"] = "int"; arg_types["font-scale"] = "float"; arg_types["file-font-size"] = "int"; arg_types["dir-font-size"] = "int"; arg_types["user-font-size"] = "int"; arg_types["hash-seed"] = "int"; arg_types["user-filter"] = "multi-value"; arg_types["user-show-filter"] = "multi-value"; arg_types["file-filter"] = "multi-value"; arg_types["file-show-filter"] = "multi-value"; arg_types["follow-user"] = "multi-value"; arg_types["highlight-user"] = "multi-value"; arg_types["log-level"] = "string"; arg_types["background-image"] = "string"; arg_types["logo"] = "string"; arg_types["logo-offset"] = "string"; arg_types["log-command"] = "string"; arg_types["load-config"] = "string"; arg_types["save-config"] = "string"; arg_types["output-custom-log"] = "string"; arg_types["path"] = "string"; arg_types["log-command"] = "string"; arg_types["background-colour"] = "string"; arg_types["file-idle-time"] = "string"; arg_types["file-idle-time-at-end"] = "string"; arg_types["user-image-dir"] = "string"; arg_types["default-user-image"] = "string"; arg_types["date-format"] = "string"; arg_types["log-format"] = "string"; arg_types["git-branch"] = "string"; arg_types["start-position"] = "string"; arg_types["start-date"] = "string"; arg_types["stop-date"] = "string"; arg_types["stop-position"] = "string"; arg_types["crop"] = "string"; arg_types["hide"] = "string"; arg_types["max-file-lag"] = "string"; arg_types["user-scale"] = "string"; arg_types["camera-mode"] = "string"; arg_types["title"] = "string"; arg_types["font-file"] = "string"; arg_types["font-colour"] = "string"; arg_types["highlight-colour"] = "string"; arg_types["selection-colour"] = "string"; arg_types["dir-colour"] = "string"; arg_types["caption-file"] = "string"; arg_types["caption-size"] = "int"; arg_types["caption-duration"] = "float"; arg_types["caption-colour"] = "string"; arg_types["caption-offset"] = "int"; arg_types["filename-colour"] = "string"; arg_types["filename-time"] = "float"; arg_types["dir-name-depth"] = "int"; } void GourceSettings::setGourceDefaults() { path = "."; default_path = true; ffp = false; hide_date = false; hide_users = false; hide_tree = false; hide_files = false; hide_usernames = false; hide_filenames = false; hide_dirnames = false; hide_progress = false; hide_bloom = false; hide_mouse = false; hide_root = false; start_timestamp = 0; start_date = ""; stop_timestamp = 0; stop_date = ""; start_position = 0.0f; stop_position = 0.0f; stop_at_time = -1.0f; stop_on_idle = false; stop_at_end = false; dont_stop = false; no_time_travel = false; fixed_user_size = false; show_key = false; disable_auto_rotate = false; disable_input = false; auto_skip_seconds = 3.0f; days_per_second = 0.1f; // TODO: check this is right file_idle_time = 0.0f; file_idle_time_at_end = 0.0f; time_scale = 1.0f; loop = false; loop_delay_seconds = 3.0f; logo = ""; logo_offset = vec2(20.0f,20.0f); colour_user_images = false; default_user_image = ""; user_image_dir = ""; user_image_map.clear(); camera_zoom_min = 50.0f; camera_zoom_default = 100.0f; camera_zoom_max = 10000.0f; camera_mode = "overview"; padding = 1.1f; crop_vertical = false; crop_horizontal = false; bloom_multiplier = 1.0f; bloom_intensity = 0.75f; background_colour = vec3(0.1f, 0.1f, 0.1f); background_image = ""; title = ""; font_scale = 1.0f; default_font_scale = true; font_file = GOURCE_FONT_FILE; font_size = 16; filename_font_size = 14; dirname_font_size = 14; user_font_size = 14; dir_colour = vec3(1.0f); font_colour = vec3(1.0f); highlight_colour = vec3(1.0f); selection_colour = vec3(1.0, 1.0, 0.3f); dir_name_depth = 0; dir_name_position = 0.5f; elasticity = 0.0f; git_branch = ""; log_format = ""; date_format = "%A, %d %B, %Y %X"; max_files = 0; max_user_speed = 500.0f; max_file_lag = 5.0f; user_idle_time = 3.0f; user_friction = 1.0f; user_scale = 1.0f; follow_users.clear(); highlight_users.clear(); highlight_all_users = false; highlight_dirs = false; caption_file = ""; caption_duration = 10.0f; caption_size = 16; caption_offset = 0; caption_colour = vec3(1.0f, 1.0f, 1.0f); filename_colour = vec3(1.0f, 1.0f, 1.0f); filename_time = 4.0f; gStringHashSeed = 31; //delete file filters for(std::vector::iterator it = file_filters.begin(); it != file_filters.end(); it++) { delete (*it); } file_filters.clear(); //delete file whitelists for(std::vector::iterator it = file_show_filters.begin(); it != file_show_filters.end(); it++) { delete (*it); } file_show_filters.clear(); file_extensions = false; file_extension_fallback = false; //delete user filters for(std::vector::iterator it = user_filters.begin(); it != user_filters.end(); it++) { delete (*it); } user_filters.clear(); //delete user whitelist for(std::vector::iterator it = user_show_filters.begin(); it != user_show_filters.end(); it++) { delete (*it); } user_show_filters.clear(); setScaledFontSizes(); } void GourceSettings::setScaledFontSizes() { scaled_font_size = glm::clamp((int)(font_size * font_scale), 1, 100); scaled_user_font_size = glm::clamp((int)(user_font_size * font_scale), 1, 100); scaled_dirname_font_size = glm::clamp((int)(dirname_font_size * font_scale), 1, 100); scaled_filename_font_size = glm::clamp((int)(filename_font_size * font_scale), 1, 100); } void GourceSettings::commandLineOption(const std::string& name, const std::string& value) { if(name == "help") { help(); } if(name == "extended-help") { help(true); } if(name == "load-config" && value.size() > 0) { load_config = value; return; } if(name == "save-config" && value.size() > 0) { save_config = value; return; } std::string log_command; if(name == "log-command") { log_command = value; } if(name == "git-log-command" || log_command == "git") { SDLAppInfo(GitCommitLog::logCommand()); } if(name == "cvs-exp-command" || log_command == "cvs-exp") { SDLAppInfo(CVSEXPCommitLog::logCommand()); } if(log_command == "cvs") { throw ConfFileException("please use either 'cvs2cl' or 'cvs-exp'", "", 0); } if(name == "cvs2cl-command" || log_command == "cvs2cl") { SDLAppInfo(CVS2CLCommitLog::logCommand()); } if(name == "svn-log-command" || log_command == "svn") { SDLAppInfo(SVNCommitLog::logCommand()); } if(name == "hg-log-command" || log_command == "hg") { SDLAppInfo(MercurialLog::logCommand()); } if(name == "bzr-log-command" || log_command == "bzr") { SDLAppInfo(BazaarLog::logCommand()); } if(name == "output-custom-log" && value.size() > 0) { output_custom_filename = value; return; } if(name == "log-level") { if(value == "warn") { log_level = LOG_LEVEL_WARN; } else if(value == "debug") { log_level = LOG_LEVEL_DEBUG; } else if(value == "info") { log_level = LOG_LEVEL_INFO; } else if(value == "error") { log_level = LOG_LEVEL_ERROR; } else if(value == "pedantic") { log_level = LOG_LEVEL_PEDANTIC; } return; } std::string invalid_error = std::string("invalid ") + name + std::string(" value"); throw ConfFileException(invalid_error, "", 0); } #ifdef __APPLE__ #include #endif void GourceSettings::importGourceSettings(ConfFile& conffile, ConfSection* gource_settings) { setGourceDefaults(); if(gource_settings == 0) gource_settings = conffile.getSection(default_section_name); if(gource_settings == 0) { gource_settings = conffile.addSection("gource"); } ConfEntry* entry = 0; //hide flags std::vector hide_fields; if((entry = gource_settings->getEntry("hide")) != 0) { if(!entry->hasValue()) conffile.missingValueException(entry); std::string hide_string = entry->getString(); size_t sep; while((sep = hide_string.find(",")) != std::string::npos) { if(sep == 0 && hide_string.size()==1) break; if(sep == 0) { hide_string = hide_string.substr(sep+1, hide_string.size()-1); continue; } std::string hide_field = hide_string.substr(0, sep); hide_fields.push_back(hide_field); hide_string = hide_string.substr(sep+1, hide_string.size()-1); } if(hide_string.size() > 0 && hide_string != ",") hide_fields.push_back(hide_string); //validate field list for(std::vector::iterator it = hide_fields.begin(); it != hide_fields.end(); it++) { std::string hide_field = (*it); if( hide_field != "date" && hide_field != "users" && hide_field != "tree" && hide_field != "files" && hide_field != "usernames" && hide_field != "filenames" && hide_field != "dirnames" && hide_field != "bloom" && hide_field != "progress" && hide_field != "mouse" && hide_field != "root") { std::string unknown_hide_option = std::string("unknown option hide ") + hide_field; conffile.entryException(entry, unknown_hide_option); } } } //check hide booleans for(std::map::iterator it = arg_types.begin(); it != arg_types.end(); it++) { if(it->first.find("hide-") == 0 && it->second == "bool") { if(gource_settings->getBool(it->first)) { std::string hide_field = it->first.substr(5, it->first.size()-5); hide_fields.push_back(hide_field); } } } if(hide_fields.size()>0) { for(std::vector::iterator it = hide_fields.begin(); it != hide_fields.end(); it++) { std::string hidestr = (*it); if(hidestr == "date") hide_date = true; else if(hidestr == "users") hide_users = true; else if(hidestr == "tree") hide_tree = true; else if(hidestr == "files") hide_files = true; else if(hidestr == "usernames") hide_usernames = true; else if(hidestr == "filenames") hide_filenames = true; else if(hidestr == "dirnames") hide_dirnames = true; else if(hidestr == "bloom") hide_bloom = true; else if(hidestr == "progress") hide_progress = true; else if(hidestr == "root") hide_root = true; else if(hidestr == "mouse") { hide_mouse = true; hide_progress = true; } } } if((entry = gource_settings->getEntry("date-format")) != 0) { if(!entry->hasValue()) conffile.missingValueException(entry); date_format = entry->getString(); } if(gource_settings->getBool("disable-auto-rotate")) { disable_auto_rotate=true; } if(gource_settings->getBool("disable-auto-skip")) { auto_skip_seconds = -1.0; } if(gource_settings->getBool("disable-input")) { disable_input=true; } if(gource_settings->getBool("loop")) { loop = true; } if((entry = gource_settings->getEntry("loop-delay-seconds")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify loop-delay-seconds (float)"); loop_delay_seconds = entry->getFloat(); if(loop_delay_seconds<=0.0f) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("git-branch")) != 0) { if(!entry->hasValue()) conffile.missingValueException(entry); Regex branch_regex("^(?!-)[/\\w.,;_=+{}\\[\\]-]+$"); std::string branch = entry->getString(); if(branch_regex.match(branch)) { git_branch = branch; } else { conffile.invalidValueException(entry); } } if(gource_settings->getBool("colour-images")) { colour_user_images = true; } if((entry = gource_settings->getEntry("crop")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify crop (vertical,horizontal)"); std::string crop = entry->getString(); if(crop == "vertical") { crop_vertical = true; } else if (crop == "horizontal") { crop_horizontal = true; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("log-format")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify log-format (format)"); log_format = entry->getString(); if(log_format == "cvs") { conffile.entryException(entry, "please use either 'cvs2cl' or 'cvs-exp'"); } if( log_format != "git" && log_format != "cvs-exp" && log_format != "cvs2cl" && log_format != "svn" && log_format != "custom" && log_format != "hg" && log_format != "bzr" && log_format != "apache") { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("default-user-image")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify default-user-image (image path)"); default_user_image = entry->getString(); } if((entry = gource_settings->getEntry("user-image-dir")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify user-image-dir (directory)"); user_image_dir = entry->getString(); //append slash if(user_image_dir[user_image_dir.size()-1] != '/') { user_image_dir += std::string("/"); } user_image_map.clear(); boost::filesystem::path image_dir_path(user_image_dir); if(!is_directory(image_dir_path)) { conffile.entryException(entry, "specified user-image-dir is not a directory"); } std::vector image_dir_files; try { copy(boost::filesystem::directory_iterator(image_dir_path), boost::filesystem::directory_iterator(), back_inserter(image_dir_files)); } catch(const boost::filesystem::filesystem_error& exception) { conffile.entryException(entry, "error reading specified user-image-dir"); } for(boost::filesystem::path& p : image_dir_files) { std::string dirfile; #ifdef _WIN32 std::wstring dirfile_16 = p.filename().wstring(); utf8::utf16to8(dirfile_16.begin(), dirfile_16.end(), back_inserter(dirfile)); #else dirfile = p.filename().string(); #endif std::string file_ext = extension(p); boost::algorithm::to_lower(file_ext); if(file_ext != ".jpg" && file_ext != ".jpeg" && file_ext != ".png") continue; std::string image_path = gGourceSettings.user_image_dir + dirfile; std::string name = dirfile.substr(0,dirfile.size() - file_ext.size()); #ifdef __APPLE__ CFMutableStringRef help = CFStringCreateMutable(kCFAllocatorDefault, 0); CFStringAppendCString(help, name.c_str(), kCFStringEncodingUTF8); CFStringNormalize(help, kCFStringNormalizationFormC); char data[4096]; CFStringGetCString(help, data, sizeof(data), kCFStringEncodingUTF8); name = data; #endif debugLog("%s => %s", name.c_str(), image_path.c_str()); user_image_map[name] = image_path; } } if((entry = gource_settings->getEntry("caption-file")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify caption file (filename)"); caption_file = entry->getString(); if(!boost::filesystem::exists(caption_file)) { conffile.entryException(entry, "caption file not found"); } } if((entry = gource_settings->getEntry("caption-duration")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify caption duration (seconds)"); caption_duration = entry->getFloat(); if(caption_duration <= 0.0f) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("caption-size")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify caption size"); caption_size = entry->getInt(); if(caption_size<1 || caption_size>100) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("caption-offset")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify caption offset"); caption_offset = entry->getInt(); } if((entry = gource_settings->getEntry("caption-colour")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify caption colour (FFFFFF)"); int r,g,b; std::string colstring = entry->getString(); if(entry->isVec3()) { caption_colour = entry->getVec3(); } else if(colstring.size()==6 && sscanf(colstring.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { caption_colour = vec3(r,g,b); caption_colour /= 255.0f; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("filename-colour")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify filename colour (FFFFFF)"); int r,g,b; std::string colstring = entry->getString(); if(entry->isVec3()) { filename_colour = entry->getVec3(); } else if(colstring.size()==6 && sscanf(colstring.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { filename_colour = vec3(r,g,b); filename_colour /= 255.0f; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("filename-time")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify duration to keep files on screen (float)"); filename_time = entry->getFloat(); if(filename_time<2.0f) { conffile.entryException(entry, "filename-time must be >= 2.0"); } } if((entry = gource_settings->getEntry("bloom-intensity")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify bloom-intensity (float)"); bloom_intensity = entry->getFloat(); if(bloom_intensity<=0.0f) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("bloom-multiplier")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify bloom-multiplier (float)"); bloom_multiplier = entry->getFloat(); if(bloom_multiplier<=0.0f) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("elasticity")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify elasticity (float)"); elasticity = entry->getFloat(); if(elasticity<=0.0f) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("font-file")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify font file"); font_file = entry->getString(); boost::filesystem::path font_file_path(font_file); if(!boost::filesystem::exists(font_file_path)) { conffile.invalidValueException(entry); } font_file = boost::filesystem::canonical(font_file_path).string(); if(font_file.empty()) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("font-size")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify font size"); font_size = entry->getInt(); if(font_size<1 || font_size>100) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("file-font-size")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify font size"); filename_font_size = entry->getInt(); if(filename_font_size<1 || filename_font_size>100) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("dir-font-size")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify font size"); dirname_font_size = entry->getInt(); if(dirname_font_size<1 || dirname_font_size>100) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("user-font-size")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify font size"); user_font_size = entry->getInt(); if(user_font_size<1 || user_font_size>100) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("font-scale")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify font scale"); font_scale = entry->getFloat(); default_font_scale = false; if(font_scale<0.0f || font_scale>10.0f) { conffile.invalidValueException(entry); } setScaledFontSizes(); } if((entry = gource_settings->getEntry("hash-seed")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify hash seed (integer)"); gStringHashSeed = entry->getInt(); } if((entry = gource_settings->getEntry("font-colour")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify font colour (FFFFFF)"); int r,g,b; std::string colstring = entry->getString(); if(entry->isVec3()) { font_colour = entry->getVec3(); } else if(colstring.size()==6 && sscanf(colstring.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { font_colour = vec3(r,g,b); font_colour /= 255.0f; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("background-colour")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify background colour (FFFFFF)"); int r,g,b; std::string colstring = entry->getString(); if(entry->isVec3()) { background_colour = entry->getVec3(); } else if(colstring.size()==6 && sscanf(colstring.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { background_colour = vec3(r,g,b); background_colour /= 255.0f; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("highlight-colour")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify highlight colour (FFFFFF)"); int r,g,b; std::string colstring = entry->getString(); if(entry->isVec3()) { highlight_colour = entry->getVec3(); } else if(colstring.size()==6 && sscanf(colstring.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { highlight_colour = vec3(r,g,b); highlight_colour /= 255.0f; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("selection-colour")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify selection colour (FFFFFF)"); int r,g,b; std::string colstring = entry->getString(); if(entry->isVec3()) { selection_colour = entry->getVec3(); } else if(colstring.size()==6 && sscanf(colstring.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { selection_colour = vec3(r,g,b); selection_colour /= 255.0f; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("dir-colour")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify dir colour (FFFFFF)"); int r,g,b; std::string colstring = entry->getString(); if(entry->isVec3()) { dir_colour = entry->getVec3(); } else if(colstring.size()==6 && sscanf(colstring.c_str(), "%02x%02x%02x", &r, &g, &b) == 3) { dir_colour = vec3(r,g,b); dir_colour /= 255.0f; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("background-image")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify background image (image path)"); background_image = entry->getString(); } if((entry = gource_settings->getEntry("title")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify title"); title = entry->getString(); } if((entry = gource_settings->getEntry("logo")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify logo (image path)"); logo = entry->getString(); } if((entry = gource_settings->getEntry("logo-offset")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify logo-offset (XxY)"); std::string logo_offset_str = entry->getString(); int posx = 0; int posy = 0; if(parseRectangle(logo_offset_str, posx, posy)) { logo_offset = vec2(posx, posy); } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("seconds-per-day")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify seconds-per-day (seconds)"); float seconds_per_day = entry->getFloat(); if(seconds_per_day<=0.0f) { conffile.invalidValueException(entry); } // convert seconds-per-day to days-per-second days_per_second = 1.0 / seconds_per_day; } if((entry = gource_settings->getEntry("auto-skip-seconds")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify auto-skip-seconds (seconds)"); auto_skip_seconds = entry->getFloat(); if(auto_skip_seconds <= 0.0) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("file-idle-time")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify file-idle-time (seconds)"); std::string file_idle_str = entry->getString(); file_idle_time = (float) atoi(file_idle_str.c_str()); if(file_idle_time<0.0f || (file_idle_time == 0.0f && file_idle_str[0] != '0') ) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("file-idle-time-at-end")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify file-idle-time-at-end (seconds)"); std::string file_idle_at_end_str = entry->getString(); file_idle_time_at_end = (float) atoi(file_idle_at_end_str.c_str()); if(file_idle_time_at_end<0.0f || (file_idle_time_at_end == 0.0f && file_idle_at_end_str[0] != '0') ) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("user-idle-time")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify user-idle-time (seconds)"); user_idle_time = entry->getFloat(); if(user_idle_time < 0.0f) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("time-scale")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify time-scale (scale)"); time_scale = entry->getFloat(); if(time_scale <= 0.0f || time_scale > 4.0f) { conffile.entryException(entry, "time-scale outside of range 0.0 - 4.0"); } } if((entry = gource_settings->getEntry("start-date")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify start-date (YYYY-MM-DD hh:mm:ss)"); std::string start_date_string = entry->getString(); if(parseDateTime(start_date_string, start_timestamp)) { char datestr[256]; strftime(datestr, 256, "%Y-%m-%d", localtime ( &start_timestamp )); start_date = datestr; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("stop-date")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify stop-date (YYYY-MM-DD hh:mm:ss)"); std::string end_date_string = entry->getString(); if(parseDateTime(end_date_string, stop_timestamp)) { struct tm * timeinfo; timeinfo = localtime ( &stop_timestamp ); time_t stop_timestamp_rounded = stop_timestamp; if(timeinfo->tm_hour > 0 || timeinfo->tm_min > 0 || timeinfo->tm_sec > 0) { stop_timestamp_rounded += 60*60*24; } char datestr[256]; strftime(datestr, 256, "%Y-%m-%d", localtime ( &stop_timestamp_rounded )); stop_date = datestr; } else { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("start-position")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify start-position (float,random)"); if(entry->getString() == "random") { srand(time(0)); start_position = (rand() % 1000) / 1000.0f; } else { start_position = entry->getFloat(); if(start_position<=0.0 || start_position>=1.0) { conffile.entryException(entry, "start-position outside of range 0.0 - 1.0 (non-inclusive)"); } } } if((entry = gource_settings->getEntry("stop-position")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify stop-position (float)"); stop_position = entry->getFloat(); if(stop_position<=0.0 || stop_position>1.0) { conffile.entryException(entry, "stop-position outside of range 0.0 - 1.0 (inclusive)"); } } if((entry = gource_settings->getEntry("stop-at-time")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify stop-at-time (seconds)"); stop_at_time = entry->getFloat(); if(stop_at_time <= 0.0) { conffile.invalidValueException(entry); } } if(gource_settings->getBool("key")) { show_key = true; } if(gource_settings->getBool("ffp")) { ffp = true; } if(gource_settings->getBool("realtime")) { days_per_second = 1.0 / 86400.0; } if(gource_settings->getBool("no-time-travel")) { no_time_travel = true; } if(gource_settings->getBool("dont-stop")) { dont_stop = true; } if(gource_settings->getBool("stop-at-end")) { stop_at_end = true; } //NOTE: this no longer does anything if(gource_settings->getBool("stop-on-idle")) { stop_on_idle = true; } if(gource_settings->getBool("fixed-user-size")) { fixed_user_size = true; } if((entry = gource_settings->getEntry("max-files")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify max-files (number)"); max_files = entry->getInt(); if( max_files<0 || (max_files == 0 && entry->getString() != "0") ) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("max-file-lag")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify max-file-lag (seconds)"); max_file_lag = entry->getFloat(); if(max_file_lag==0.0) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("user-friction")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify user-friction (seconds)"); user_friction = entry->getFloat(); if(user_friction<=0.0) { conffile.invalidValueException(entry); } user_friction = 1.0 / user_friction; } if((entry = gource_settings->getEntry("user-scale")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify user-scale (scale)"); user_scale = entry->getFloat(); if(user_scale<=0.0 || user_scale>100.0) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("max-user-speed")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify max-user-speed (units)"); max_user_speed = entry->getFloat(); if(max_user_speed<=0) { conffile.invalidValueException(entry); } } if( gource_settings->getBool("highlight-users") || gource_settings->getBool("highlight-all-users")) { highlight_all_users = true; } if(gource_settings->getBool("highlight-dirs")) { highlight_dirs = true; } if((entry = gource_settings->getEntry("camera-mode")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify camera-mode (overview,track)"); camera_mode = entry->getString(); if(camera_mode != "overview" && camera_mode != "track") { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("padding")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify padding (float)"); padding = entry->getFloat(); if(padding <= 0.0f || padding >= 2.0f) { conffile.invalidValueException(entry); } } // multi-value entries if((entry = gource_settings->getEntry("highlight-user")) != 0) { ConfEntryList* highlight_user_entries = gource_settings->getEntries("highlight-user"); for(ConfEntryList::iterator it = highlight_user_entries->begin(); it != highlight_user_entries->end(); it++) { entry = *it; if(!entry->hasValue()) conffile.entryException(entry, "specify highlight-user (user)"); highlight_users.push_back(entry->getString()); } } if((entry = gource_settings->getEntry("follow-user")) != 0) { ConfEntryList* follow_user_entries = gource_settings->getEntries("follow-user"); for(ConfEntryList::iterator it = follow_user_entries->begin(); it != follow_user_entries->end(); it++) { entry = *it; if(!entry->hasValue()) conffile.entryException(entry, "specify follow-user (user)"); follow_users.push_back(entry->getString()); } } if(gource_settings->getBool("file-extensions")) { file_extensions=true; } if(gource_settings->getBool("file-extension-fallback")) { file_extension_fallback=true; } if((entry = gource_settings->getEntry("file-filter")) != 0) { ConfEntryList* filters = gource_settings->getEntries("file-filter"); for(ConfEntryList::iterator it = filters->begin(); it != filters->end(); it++) { entry = *it; if(!entry->hasValue()) conffile.entryException(entry, "specify file-filter (regex)"); std::string filter_string = entry->getString(); Regex* r = new Regex(filter_string, 1); if(!r->isValid()) { delete r; conffile.entryException(entry, "invalid file-filter regular expression"); } file_filters.push_back(r); } } if((entry = gource_settings->getEntry("file-show-filter")) != 0) { ConfEntryList* filters = gource_settings->getEntries("file-show-filter"); for(ConfEntryList::iterator it = filters->begin(); it != filters->end(); it++) { entry = *it; if(!entry->hasValue()) conffile.entryException(entry, "specify file-show-filter (regex)"); std::string filter_string = entry->getString(); Regex* r = new Regex(filter_string, 1); if(!r->isValid()) { delete r; conffile.entryException(entry, "invalid file-show-filter regular expression"); } file_show_filters.push_back(r); } } if((entry = gource_settings->getEntry("user-filter")) != 0) { ConfEntryList* filters = gource_settings->getEntries("user-filter"); for(ConfEntryList::iterator it = filters->begin(); it != filters->end(); it++) { entry = *it; if(!entry->hasValue()) conffile.entryException(entry, "specify user-filter (regex)"); std::string filter_string = entry->getString(); Regex* r = new Regex(filter_string, 1); if(!r->isValid()) { delete r; conffile.entryException(entry, "invalid user-filter regular expression"); } user_filters.push_back(r); } } if((entry = gource_settings->getEntry("user-show-filter")) != 0) { ConfEntryList* filters = gource_settings->getEntries("user-show-filter"); for(ConfEntryList::iterator it = filters->begin(); it != filters->end(); it++) { entry = *it; if(!entry->hasValue()) conffile.entryException(entry, "specify user-show-filter (regex)"); std::string filter_string = entry->getString(); Regex* r = new Regex(filter_string, 1); if(!r->isValid()) { delete r; conffile.entryException(entry, "invalid user-show-filter regular expression"); } user_show_filters.push_back(r); } } if((entry = gource_settings->getEntry("dir-name-depth")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify dir-name-depth (depth)"); dir_name_depth = entry->getInt(); if(dir_name_depth <= 0) { conffile.invalidValueException(entry); } } if((entry = gource_settings->getEntry("dir-name-position")) != 0) { if(!entry->hasValue()) conffile.entryException(entry, "specify dir-name-position (float)"); dir_name_position = entry->getFloat(); if(dir_name_position < 0.1f || dir_name_position > 1.0f) { conffile.entryException(entry, "dir-name-position outside of range 0.1 - 1.0 (inclusive)"); } } //validate path if(gource_settings->hasValue("path")) { path = gource_settings->getString("path"); default_path = false; } if(path == "-") { if(log_format.size() == 0) { throw ConfFileException("log-format required when reading from STDIN", "", 0); } #ifdef _WIN32 DWORD available_bytes; HANDLE stdin_handle = GetStdHandle(STD_INPUT_HANDLE); while(PeekNamedPipe(stdin_handle, 0, 0, 0, &available_bytes, 0) && available_bytes==0 && !std::cin.fail()) { SDL_Delay(100); } #else while(std::cin.peek() == EOF && !std::cin.fail()) SDL_Delay(100); #endif std::cin.clear(); } else if(!path.empty() && path != ".") { //remove trailing slash if(path[path.size()-1] == '\\' || path[path.size()-1] == '/') { path.resize(path.size()-1); } // check path exists if(!boost::filesystem::exists(path)) { throw ConfFileException(str(boost::format("'%s' does not appear to be a valid file or directory") % path), "", 0); } } } gource-0.54/src/gource_settings.h0000644002342600234260000001005614362112042016727 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef GOURCE_SETTINGS_H #define GOURCE_SETTINGS_H #define GOURCE_VERSION "0.54" #include "core/texture.h" #include "core/settings.h" #include "core/regex.h" class GourceSettings : public SDLAppSettings { protected: void commandLineOption(const std::string& name, const std::string& value); public: int repo_count; bool hide_date; bool hide_users; bool hide_tree; bool hide_files; bool hide_usernames; bool hide_filenames; bool hide_dirnames; bool hide_progress; bool hide_bloom; bool hide_mouse; bool hide_root; bool disable_auto_rotate; bool disable_input; bool show_key; std::string load_config; std::string save_config; std::string path; bool default_path; std::string logo; vec2 logo_offset; std::string start_date; std::string stop_date; time_t start_timestamp; time_t stop_timestamp; float start_position; float stop_position; float stop_at_time; bool shutdown; bool stop_on_idle; bool stop_at_end; bool dont_stop; bool no_time_travel; bool fixed_user_size; float auto_skip_seconds; float days_per_second; float file_idle_time; float file_idle_time_at_end; float loop_delay_seconds; bool loop; bool ffp; bool colour_user_images; std::string default_user_image; std::string user_image_dir; std::map user_image_map; float camera_zoom_min; float camera_zoom_max; float camera_zoom_default; std::string camera_mode; float padding; bool crop_vertical; bool crop_horizontal; float bloom_multiplier; float bloom_intensity; vec3 background_colour; std::string background_image; std::string title; std::string font_file; int font_size; int filename_font_size; int dirname_font_size; int user_font_size; vec3 font_colour; float font_scale; bool default_font_scale; int scaled_font_size; int scaled_filename_font_size; int scaled_dirname_font_size; int scaled_user_font_size; float elasticity; std::string git_branch; std::string log_format; std::string date_format; int max_files; float max_user_speed; float max_file_lag; float user_idle_time; float user_friction; float user_scale; float time_scale; bool highlight_dirs; bool highlight_all_users; vec3 dir_colour; vec3 highlight_colour; vec3 selection_colour; int dir_name_depth; float dir_name_position; std::vector highlight_users; std::vector follow_users; std::vector file_filters; std::vector file_show_filters; std::vector user_filters; std::vector user_show_filters; bool file_extensions; bool file_extension_fallback; std::string caption_file; vec3 caption_colour; float caption_duration; int caption_size; int caption_offset; vec3 filename_colour; float filename_time; std::string output_custom_filename; TextureResource* file_graphic; int log_level; GourceSettings(); void setGourceDefaults(); void setScaledFontSizes(); void importGourceSettings(ConfFile& conf, ConfSection* gource_settings = 0); void help(bool extended_help=false); }; extern GourceSettings gGourceSettings; #endif gource-0.54/src/pawn.cpp0000644002342600234260000001057414362112042015030 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "pawn.h" float gGourceShadowStrength = 0.5; Pawn::Pawn(const std::string& name, vec2 pos, int tagid) { this->name = name; this->pos = pos; this->tagid = tagid; this->hidden = false; this->speed = 1.0; selected = false; mouseover = false; shadow = false; namewidth = 0; this->shadowOffset = vec2(2.0, 2.0); this->elapsed = 0.0; this->fadetime = 1.0; this->nametime = 5.0; this->name_interval = 0.0; this->namecol = vec3(1.0, 1.0, 1.0); this->graphic = 0; this->graphic_ratio = 1.0; size = 0.0f; } float Pawn::getSize() { return size; } void Pawn::setPos(vec2 pos) { this->pos = pos; } int Pawn::getTagID() { return tagid; } void Pawn::showName() { if(name_interval <= 0.0) name_interval = nametime; } void Pawn::updateQuadItemBounds() { float halfsize_x = size * 0.5f; vec2 halfsize ( halfsize_x, halfsize_x * graphic_ratio ); //set bounds quadItemBounds.set(pos - halfsize, pos + halfsize); } void Pawn::logic(float dt) { elapsed += dt; if(!isHidden()) { if(name_interval>0.0) name_interval -= dt; } } void Pawn::setGraphic(TextureResource* graphic) { if(graphic) { graphic_ratio = graphic->h / (float) graphic->w; } else { graphic_ratio = 1.0f; } this->graphic = graphic; this->dims = vec2(size, size*graphic_ratio); } void Pawn::setMouseOver(bool over) { //showName(); this->mouseover = over; } void Pawn::setSelected(bool selected) { this->selected = selected; } const vec3& Pawn::getNameColour() const { return namecol; } void Pawn::calcScreenPos(const vec2& offset) { screenpos = display.project(vec3(pos.x+offset.x, pos.y+offset.y, 0.0f)); } bool Pawn::nameVisible() const { return ((!selected && name_interval < 0.0) || isHidden()) ? false : true; } void Pawn::drawName() { if(!nameVisible()) return; float done = nametime - name_interval; if(done < 1.0) { drawNameText(done); } else if(done > 1.0 && done < nametime - 1.0) { drawNameText(1.0); } else { drawNameText((nametime - done)); } } void Pawn::drawShadow(float dt) { if(isHidden() || !shadow) return; float halfsize = size * 0.5f; vec2 offsetpos = pos - vec2(halfsize, halfsize*graphic_ratio) + shadowOffset; float alpha = getAlpha(); glBindTexture(GL_TEXTURE_2D, graphic->textureid); glColor4f(0.0, 0.0, 0.0, alpha * gGourceShadowStrength); glPushMatrix(); glTranslatef(offsetpos.x, offsetpos.y, 0.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex2f(0.0f, 0.0f); glTexCoord2f(1.0f,0.0f); glVertex2f(size, 0.0f); glTexCoord2f(1.0f,1.0f); glVertex2f(size, size*graphic_ratio); glTexCoord2f(0.0f,1.0f); glVertex2f(0.0f, size*graphic_ratio); glEnd(); glPopMatrix(); } void Pawn::draw(float dt) { if(hidden) return; float halfsize = size * 0.5f; vec2 offsetpos = pos - vec2(halfsize, halfsize*graphic_ratio); float alpha = getAlpha(); vec3 col = getColour(); glBindTexture(GL_TEXTURE_2D, graphic->textureid); glPushMatrix(); glTranslatef(offsetpos.x, offsetpos.y, 0.0f); glColor4f(col.x, col.y, col.z, alpha); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex2f(0.0f, 0.0f); glTexCoord2f(1.0f,0.0f); glVertex2f(size, 0.0f); glTexCoord2f(1.0f,1.0f); glVertex2f(size, size*graphic_ratio); glTexCoord2f(0.0f,1.0f); glVertex2f(0.0f, size*graphic_ratio); glEnd(); glPopMatrix(); } gource-0.54/src/file.h0000644002342600234260000000441014362112042014437 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef RFILE_H #define RFILE_H #include "pawn.h" #include "dirnode.h" #include "core/stringhash.h" class RDirNode; class RFile : public Pawn { vec3 file_colour; vec3 touch_colour; RDirNode* dir; time_t removed_timestamp; bool forced_removal; bool expired; bool removing; float fade_start; float last_action; float radius; vec2 dest; float distance; // FXLabel* label; //GLuint namelist; void setFilename(const std::string& abs_file_path); const vec3& getNameColour() const; void drawNameText(float alpha); public: std::string path; std::string fullpath; std::string ext; RFile(const std::string & name, const vec3 & colour, const vec2 & pos, int tagid); ~RFile(); bool overlaps(const vec2& pos) const; void setFileColour(const vec3 & colour); const vec3 & getFileColour() const; vec3 getColour() const; void colourize(); float getAlpha() const; void touch(time_t touch_timestamp, const vec3& colour); void setHidden(bool hidden); void setDest(const vec2 & dest){ this->dest = dest; } void setDistance(float distance){ this->distance = distance; } void calcScreenPos(GLint* viewport, GLdouble* modelview, GLdouble* projection); void logic(float dt); void draw(float dt); void remove(time_t removed_timestamp); void remove(); vec2 getAbsolutePos() const; RDirNode* getDir() const; void setDir(RDirNode* dir); }; extern float gGourceFileDiameter; extern std::vector gGourceRemovedFiles; #endif gource-0.54/src/bloom.cpp0000644002342600234260000000703714362112042015173 0ustar andrewcandrewc/* Copyright (C) 2011 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "bloom.h" //bloombuf bloombuf::bloombuf(int data_size) : data_size(data_size) { bufferid = 0; buffer_size = 0; vertex_count = 0; data = data_size > 0 ? new bloom_vertex[data_size] : 0; //fprintf(stderr, "size of bloom_vertex = %d\n", sizeof(bloom_vertex)); } bloombuf::~bloombuf() { if(bufferid !=0) glDeleteBuffers(1, &bufferid); if(data != 0) delete[] data; } void bloombuf::resize(int new_size) { bloom_vertex* _data = data; data = new bloom_vertex[new_size]; for(int i=0;i data_size) { resize(vertex_count*2); } data[i] = v1; data[i+1] = v2; data[i+2] = v3; data[i+3] = v4; } void bloombuf::update() { if(vertex_count==0) return; //note possibly better to have a queue and cycle them here if(bufferid==0) { glGenBuffers(1, &bufferid); } glBindBuffer(GL_ARRAY_BUFFER, bufferid); //recreate buffer if less than the vertex_count if(buffer_size < vertex_count) { buffer_size = data_size; glBufferData(GL_ARRAY_BUFFER, buffer_size*sizeof(bloom_vertex), &(data[0].pos.x), GL_DYNAMIC_DRAW); } else { glBufferSubData(GL_ARRAY_BUFFER, 0, vertex_count*sizeof(bloom_vertex), &(data[0].pos.x)); } glBindBuffer(GL_ARRAY_BUFFER, 0); } void bloombuf::draw() { if(vertex_count==0 || bufferid==0) return; glBindBuffer(GL_ARRAY_BUFFER, bufferid); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2, GL_FLOAT, sizeof(bloom_vertex), 0); glColorPointer(4, GL_FLOAT, sizeof(bloom_vertex), (GLvoid*)8); // offset pos (2x4 bytes) glTexCoordPointer(4, GL_FLOAT, sizeof(bloom_vertex), (GLvoid*)24); // offset pos + colour (2x4 + 4x4 bytes) glDrawArrays(GL_QUADS, 0, vertex_count); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, 0); } gource-0.54/src/user.cpp0000644002342600234260000002513714362112042015042 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "user.h" float gGourceBeamDist = 100.0; float gGourceActionDist = 50.0; float gGourcePersonalSpaceDist = 100.0; RUser::RUser(const std::string& name, vec2 pos, int tagid) : Pawn(name,pos,tagid) { this->name = name; speed = gGourceSettings.max_user_speed; size = 20.0 * gGourceSettings.user_scale; shadowOffset = vec2(2.0, 2.0) * gGourceSettings.user_scale; shadow = true; highlighted=false; assignUserImage(); setSelected(false); last_action = 0.0; action_interval = 0.2; name_interval = 5.0; min_units_ps = 100.0; actionCount = activeCount = 0; } void RUser::addAction(RAction* action) { if(action->source != this) return; if(isIdle()) showName(); //name_interval = name_interval > 0.0 ? std::max(name_interval,nametime-1.0f) : nametime; actions.push_back(action); actionCount++; } // remove references to this file void RUser::fileRemoved(RFile* f) { for(std::list::iterator it = actions.begin(); it != actions.end(); ) { RAction* a = *it; if(a->target == f) { it = actions.erase(it); delete a; actionCount--; continue; } it++; } for(std::list::iterator it = activeActions.begin(); it != activeActions.end(); ) { RAction* a = *it; if(a->target == f) { it = activeActions.erase(it); delete a; continue; } it++; } } void RUser::applyForceUser(RUser* u) { if(u==this) return; vec2 u_pos = u->getPos(); vec2 dir = u_pos - pos; float dist = glm::length(dir); //different repelling force depending on how busy the user is float desired_dist = getActionCount() == 0 ? gGourcePersonalSpaceDist : (!actions.empty() && activeActions.empty()) ? gGourcePersonalSpaceDist * 0.1 : gGourcePersonalSpaceDist * 0.5; //resolve overlap if(dist < 0.001) { accel += 1.0f * normalise(vec2( (rand() % 100) - 50, (rand() % 100) - 50)); return; } //repelling force if(dist < desired_dist) { accel -= (desired_dist-dist) * normalise(dir); } } void RUser::applyForceAction(RAction* action) { RFile* f = action->target; vec2 f_pos = f->getAbsolutePos(); vec2 dir = f_pos - pos; float dist = glm::length(dir); float desired_dist = gGourceActionDist; //resolve overlap if(dist < 0.001) { accel += normalise(vec2( (rand() % 100) - 50, (rand() % 100) - 50)); return; } //repelling force if(dist < desired_dist) { accel -= (desired_dist - dist) * normalise(dir); return; } if(dist > gGourceBeamDist) { accel += (dist-gGourceBeamDist) * normalise(dir); } } void RUser::applyForceToActions() { if(activeActions.empty() && actions.empty()) return; last_action = elapsed; int action_influence = 0; int max_influence = 3; // move towards actions being worked on for(std::list::iterator it = activeActions.begin(); it != activeActions.end(); it++) { RAction* action = *it; applyForceAction(action); action_influence++; if(action_influence >= max_influence) break; } if(!activeActions.empty()) return; //if no actions being worked on, move towards one pending action for(std::list::iterator it = actions.begin(); it != actions.end(); it++) { RAction* action = *it; applyForceAction(action); break; } } void RUser::colourize() { usercol = colourHash(name); } void RUser::assignUserImage() { colourize(); TextureResource* graphic = 0; if(gGourceSettings.user_image_dir.size() > 0) { //try thier username // TODO: replace with map of name -> image of all pngs and jpgs in directory //gGourceSettings.user_image_dir + name + std::string(".jpg"); std::map::iterator findimage; findimage = gGourceSettings.user_image_map.find(name); //do we have this image if(findimage != gGourceSettings.user_image_map.end()) { std::string imagefile = findimage->second; if(!gGourceSettings.colour_user_images) usercol = vec3(1.0, 1.0, 1.0); graphic = texturemanager.grabFile(imagefile, true, GL_CLAMP_TO_EDGE); } } //TODO: trilinear probably should be an attribute of the texture // perhaps the mipmap option should be an enum: eg TEX_MIPMAP_TRILINEAR //nope if(!graphic) { if(gGourceSettings.default_user_image.size() > 0) { if(!gGourceSettings.colour_user_images) usercol = vec3(1.0, 1.0, 1.0); graphic = texturemanager.grabFile(gGourceSettings.default_user_image, true, GL_CLAMP_TO_EDGE); } else { graphic = texturemanager.grab("user.png", true, GL_CLAMP_TO_EDGE); } } setGraphic(graphic); usercol = usercol * 0.6f + vec3(1.0f) * 0.4f; usercol *= 0.9f; } int RUser::getActionCount() { return actionCount + activeCount; } int RUser::getPendingActionCount() { return actionCount; } void RUser::logic(float t, float dt) { Pawn::logic(dt); action_interval -= dt; bool find_nearby_action = false; if(!actions.empty() && action_interval <= 0) { find_nearby_action = true; } //add next active action, if it is in range for(std::list::iterator it = actions.begin(); it != actions.end();) { RAction* action = *it; //add all files which are too old if(gGourceSettings.max_file_lag>=0.0 && action->t < t - gGourceSettings.max_file_lag) { it = actions.erase(it); actionCount--; action->rate = 2.0; activeActions.push_back(action); activeCount++; continue; } if(!find_nearby_action) break; float action_dist = glm::length(action->target->getAbsolutePos() - pos); //queue first action in range if(action_dist < gGourceBeamDist) { it = actions.erase(it); activeActions.push_back(action); actionCount--; activeCount++; break; } it++; } //reset action interval if(action_interval <= 0) { int total_actions = actionCount + activeCount; action_interval = total_actions ? (1.0 / (float)total_actions) : 1.0; } //update actions for(std::list::iterator it = activeActions.begin(); it != activeActions.end(); ) { RAction* action = *it; action->logic(dt); if(action->isFinished()) { it = activeActions.erase(it); delete action; activeCount--; continue; } it++; } if(glm::length2(accel) > speed * speed) { accel = normalise(accel) * speed; } pos += accel * dt; accel = accel * std::max(0.0f, (1.0f - gGourceSettings.user_friction*dt)); } void RUser::updateFont() { if(selected) { font = fontmanager.grab(gGourceSettings.font_file, 18); font.dropShadow(true); } else { font = fontmanager.grab(gGourceSettings.font_file, gGourceSettings.scaled_user_font_size); font.dropShadow(true); } font.alignTop(false); namewidth = font.getWidth(name); } void RUser::setHighlighted(bool highlight) { this->highlighted = highlight; updateFont(); } void RUser::setSelected(bool selected) { Pawn::setSelected(selected); updateFont(); } const vec3& RUser::getNameColour() const { return selected ? gGourceSettings.selection_colour : highlighted ? gGourceSettings.highlight_colour : namecol; } vec3 RUser::getColour() const{ if(selected) return vec3(1.0, 1.0, 1.0); return usercol; } const std::string& RUser::getName() const { return name; } float RUser::getAlpha() const { float alpha = Pawn::getAlpha(); //user fades out if not doing anything if(elapsed - last_action > gGourceSettings.user_idle_time) { alpha = 1.0 - std::min(elapsed - last_action - gGourceSettings.user_idle_time, 1.0f); } return alpha; } bool RUser::isIdle() { return (activeActions.empty() && actions.empty()); } bool RUser::isFading() { return isIdle() && (elapsed - last_action) > gGourceSettings.user_idle_time; } bool RUser::isInactive() { return isIdle() && (elapsed - last_action) > 10.0; } bool RUser::nameVisible() const { return (Pawn::nameVisible() || gGourceSettings.highlight_all_users || highlighted) ? true : false; } void RUser::calcScreenPos(GLint* viewport, GLdouble* modelview, GLdouble* projection) { static GLdouble screen_x, screen_y, screen_z; vec2 text_pos = pos; text_pos.y -= dims.y * 0.5f; gluProject( text_pos.x, text_pos.y, 0.0f, modelview, projection, viewport, &screen_x, &screen_y, &screen_z); screen_y = (float)viewport[3] - screen_y; screenpos.x = screen_x - namewidth * 0.5; screenpos.y = screen_y - font.getMaxHeight(); } void RUser::drawNameText(float alpha) { float user_alpha = getAlpha(); if(gGourceSettings.highlight_all_users || highlighted || selected || alpha>0.0) { vec3 name_col = getNameColour(); float name_alpha = (selected||highlighted||gGourceSettings.highlight_all_users) ? user_alpha : alpha; font.setColour(vec4(name_col.x, name_col.y, name_col.z, name_alpha)); font.draw(screenpos.x, screenpos.y, name); } } void RUser::updateActionsVBO(quadbuf& buffer) { for(std::list::iterator it = activeActions.begin(); it != activeActions.end(); it++) { RAction* action = *it; action->drawToVBO(buffer); } } void RUser::drawActions(float dt) { for(std::list::iterator it = activeActions.begin(); it != activeActions.end(); it++) { RAction* action = *it; action->draw(dt); } } void RUser::draw(float dt) { if(gGourceSettings.hide_users) return; Pawn::draw(dt); } gource-0.54/src/gource.cpp0000644002342600234260000022006014362112042015340 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "gource.h" #include "core/png_writer.h" bool gGourceDrawBackground = true; bool gGourceQuadTreeDebug = false; int gGourceMaxQuadTreeDepth = 6; int gGourceUserInnerLoops = 0; Gource::Gource(FrameExporter* exporter) { this->logfile = gGourceSettings.path; commitlog = 0; //disable OpenGL 2.0 functions if not supported if(!GLEW_VERSION_2_0) gGourceSettings.ffp = true; if(!gGourceSettings.file_graphic) { gGourceSettings.file_graphic = texturemanager.grab("file.png", true, GL_CLAMP_TO_EDGE); } if(gGourceSettings.default_font_scale) { if(display.viewport_dpi_ratio.x > 1.0f) { gGourceSettings.font_scale = display.viewport_dpi_ratio.x; } else { int threshold = 1600; gGourceSettings.font_scale = (float) (1 + glm::max(0, display.height / threshold)); } debugLog("setting font scale for resolution %d x %d to %.2f", display.width, display.height, gGourceSettings.font_scale); gGourceSettings.setScaledFontSizes(); } fontlarge = fontmanager.grab(gGourceSettings.font_file, 42 * gGourceSettings.font_scale); fontlarge.dropShadow(true); fontlarge.roundCoordinates(true); fontmedium = fontmanager.grab(gGourceSettings.font_file, gGourceSettings.scaled_font_size); fontmedium.dropShadow(true); fontmedium.roundCoordinates(false); fontcaption = fontmanager.grab(gGourceSettings.font_file, gGourceSettings.caption_size); fontcaption.dropShadow(true); fontcaption.roundCoordinates(false); fontcaption.alignTop(false); font = fontmanager.grab(gGourceSettings.font_file, 14 * gGourceSettings.font_scale); font.dropShadow(true); font.roundCoordinates(true); fontdirname = fontmanager.grab(gGourceSettings.font_file, gGourceSettings.scaled_dirname_font_size); fontdirname.dropShadow(true); fontdirname.roundCoordinates(true); slider.init(); //only use bloom with alpha channel if transparent due to artifacts on some video cards std::string bloom_tga = gGourceSettings.transparent ? "bloom_alpha.tga" : "bloom.tga"; bloomtex = texturemanager.grab(bloom_tga); beamtex = texturemanager.grab("beam.png"); usertex = texturemanager.grab("user.png", true, GL_CLAMP_TO_EDGE); shadow_shader = text_shader = bloom_shader = 0; if(!gGourceSettings.ffp) { shadow_shader = shadermanager.grab("shadow"); bloom_shader = shadermanager.grab("bloom"); text_shader = shadermanager.grab("text"); } //calculate once GLint max_texture_size; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); font_texel_size = 1.0f / (float) std::min( 512, max_texture_size ); logotex = 0; backgroundtex = 0; //load logo if(gGourceSettings.logo.size() > 0) { bool mipmap_logo = !(GLEW_ARB_texture_non_power_of_two || GLEW_VERSION_2_0); logotex = texturemanager.grabFile(gGourceSettings.logo, mipmap_logo); } //load background image if(gGourceSettings.background_image.size() > 0) { backgroundtex = texturemanager.grabFile(gGourceSettings.background_image); } stop_position_reached=false; reloaded = false; paused = false; first_read = true; grab_mouse = false; mousemoved = false; mousedragged = false; mouseclicked = false; take_screenshot = false; if(gGourceSettings.hide_mouse) { cursor.showCursor(false); } splash = -1.0; debug = false; trace_debug = false; frameExporter = 0; dirNodeTree = 0; userTree = 0; selectedFile = 0; hoverFile = 0; selectedUser = 0; hoverUser = 0; date_x_offset = 0; starting_z = -300.0f; textbox = TextBox(fontmanager.grab(gGourceSettings.font_file, 18 * gGourceSettings.font_scale)); textbox.setBrightness(0.5f); textbox.show(); file_key = FileKey(1.0f); camera = ZoomCamera(vec3(0,0, starting_z), vec3(0.0, 0.0, 0.0), gGourceSettings.camera_zoom_default, gGourceSettings.camera_zoom_max); camera.setPadding(gGourceSettings.padding); setCameraMode(gGourceSettings.camera_mode); root = 0; //min phsyics rate 60fps (ie maximum allowed delta 1.0/60) max_tick_rate = 1.0 / 60.0; runtime = 0.0f; frameskip = 0; framecount = 0; reset(); logmill = new RLogMill(logfile); if(exporter!=0) setFrameExporter(exporter, gGourceSettings.output_framerate); //if recording a video or in demo mode, or multiple repos, the slider is initially hidden if(exporter==0 && gGourceSettings.repo_count==1) slider.show(); } void Gource::writeCustomLog(const std::string& logfile, const std::string& output_file) { RLogMill logmill(logfile); RCommitLog* commitlog = logmill.getLog(); // TODO: exception handling if(!commitlog) { std::string error = logmill.getError(); if(!error.empty()) SDLAppQuit(error); return; } RCommit commit; FILE* fh = stdout; if(output_file != "-") { fh = fopen(output_file.c_str(), "w"); if(!fh) return; } while(!commitlog->isFinished()) { RCommit commit; if(!commitlog->nextCommit(commit)) { if(!commitlog->isSeekable()) { break; } continue; } for(std::list::iterator it = commit.files.begin(); it != commit.files.end(); it++) { RCommitFile& cf = *it; fprintf(fh, "%lld|%s|%s|%s\n", (long long int) commit.timestamp, commit.username.c_str(), cf.action.c_str(), cf.filename.c_str()); } commit.files.clear(); } if(output_file != "-") fclose(fh); } Gource::~Gource() { reset(); if(logmill!=0) delete logmill; if(root!=0) delete root; //reset settings gGourceSettings.setGourceDefaults(); } void Gource::init() { } void Gource::unload() { file_vbo.unload(); user_vbo.unload(); edge_vbo.unload(); action_vbo.unload(); bloom_vbo.unload(); } void Gource::reload() { reloaded = true; } void Gource::quit() { } void Gource::update(float t, float dt) { float scaled_dt = std::min(dt, max_tick_rate); //if exporting a video use a fixed tick rate rather than time based if(frameExporter != 0) { scaled_dt = max_tick_rate; } //apply time scaling scaled_dt *= gGourceSettings.time_scale; //have to manage runtime internally as we're messing with dt if(!paused) runtime += scaled_dt; if(gGourceSettings.stop_at_time > 0.0 && runtime >= gGourceSettings.stop_at_time) stop_position_reached = true; logic_time = SDL_GetTicks(); logic(runtime, scaled_dt); logic_time = SDL_GetTicks() - logic_time; draw(runtime, scaled_dt); //extract frames based on frameskip setting if frameExporter defined if(frameExporter != 0 && commitlog && !gGourceSettings.shutdown) { if(framecount % (frameskip+1) == 0) { frameExporter->dump(); } } if(!gGourceSettings.hide_mouse) { //note: cursor uses real dt cursor.logic(dt); cursor.draw(); } framecount++; } //peek at the date under the mouse pointer on the slider std::string Gource::dateAtPosition(float percent) { RCommit commit; std::string date; if(percent<1.0 && commitlog->getCommitAt(percent, commit)) { //display date char datestr[256]; // TODO: memory leak ?? struct tm* timeinfo = localtime ( &(commit.timestamp) ); strftime(datestr, 256, "%A, %d %B, %Y", timeinfo); date = std::string(datestr); } return date; } void Gource::grabMouse(bool grab_mouse) { this->grab_mouse = grab_mouse; #if SDL_VERSION_ATLEAST(2,0,0) if(grab_mouse) { if(!SDL_GetRelativeMouseMode()) { // NOTE: SDL_SetWindowGrab needed as well to work around this bug: // http://bugzilla.libsdl.org/show_bug.cgi?id=1967 SDL_SetWindowGrab(display.sdl_window, SDL_TRUE); SDL_SetRelativeMouseMode(SDL_TRUE); } } else { if(SDL_GetRelativeMouseMode()) { SDL_SetWindowGrab(display.sdl_window, SDL_FALSE); SDL_SetRelativeMouseMode(SDL_FALSE); SDL_WarpMouseInWindow(display.sdl_window, mousepos.x, mousepos.y); } } #endif #if not SDL_VERSION_ATLEAST(2,0,0) if(!grab_mouse) { // restore old mouse position SDL_WarpMouse(mousepos.x, mousepos.y); } #endif cursor.showCursor(!grab_mouse); } void Gource::mouseMove(SDL_MouseMotionEvent *e) { if(commitlog==0) return; if(gGourceSettings.disable_input) return; if(gGourceSettings.hide_mouse) return; // debugLog("mouse move %d, %d (change %d, %d)", e->x, e->y, e->xrel, e->yrel); if(grab_mouse) { #if not SDL_VERSION_ATLEAST(2,0,0) int warp_x = display.width/2; int warp_y = display.height/2; //this is an even we generated by warping the mouse below if(e->x == warp_x && e->y == warp_y) return; SDL_WarpMouse(warp_x, warp_y); #endif } bool rightmouse = cursor.rightButtonPressed(); //move camera in direction the user dragged the mouse if(mousedragged || rightmouse) { vec2 mag( e->xrel, e->yrel ); //if right mouse button is held while dragging, rotate tree instead of //moving camera if(rightmouse) { manual_rotate = true; if(fabs(mag.x) > fabs(mag.y)) { rotate_angle = std::min(1.0f, (float) fabs(mag.x) / 10.0f) * 5.0f * DEGREES_TO_RADIANS; if(mag.x < 0.0f) rotate_angle = -rotate_angle; } else { rotate_angle = std::min(1.0f, (float) fabs(mag.y) / 10.0f) * 5.0f * DEGREES_TO_RADIANS; if(mag.y < 0.0f) rotate_angle = -rotate_angle; } return; } cursor_move += mag; return; } if(grab_mouse) return; mousepos = vec2(e->x, e->y); mousemoved=true; cursor.updatePos(mousepos); float pos; if(!gGourceSettings.hide_progress && slider.mouseOver(mousepos, &pos)) { std::string date = dateAtPosition(pos); slider.setCaption(date); } } void Gource::zoom(bool zoomin) { manual_zoom = true; float zoom_multi = 1.1; float distance = -camera.getDest().z; if(zoomin) { distance /= zoom_multi; if(distance < gGourceSettings.camera_zoom_min) distance = gGourceSettings.camera_zoom_min; } else { distance *= zoom_multi; if(distance > gGourceSettings.camera_zoom_max) distance = gGourceSettings.camera_zoom_max; } camera.setDistance(distance); } #if SDL_VERSION_ATLEAST(2,0,0) void Gource::mouseWheel(SDL_MouseWheelEvent *e) { if(gGourceSettings.disable_input) return; if(e->y > 0) { zoom(true); } if(e->y < 0) { zoom(false); } } #endif void Gource::mouseClick(SDL_MouseButtonEvent *e) { if(commitlog==0) return; if(gGourceSettings.disable_input) return; if(gGourceSettings.hide_mouse) return; //mouse click should stop the cursor being idle cursor.updatePos(mousepos); if(e->type == SDL_MOUSEBUTTONUP) { if(e->button == SDL_BUTTON_LEFT) { //stop dragging mouse, return the mouse to where //the user started dragging. mousedragged=false; } if(e->button == SDL_BUTTON_LEFT || e->button == SDL_BUTTON_RIGHT) { if(!cursor.buttonPressed()) { grabMouse(false); } } } if(e->type != SDL_MOUSEBUTTONDOWN) return; #if not SDL_VERSION_ATLEAST(2,0,0) //wheel up if(e->button == SDL_BUTTON_WHEELUP) { zoom(true); return; } //wheel down if(e->button == SDL_BUTTON_WHEELDOWN) { zoom(false); return; } #endif if(e->button == SDL_BUTTON_MIDDLE) { toggleCameraMode(); return; } if(e->button == SDL_BUTTON_RIGHT) { grabMouse(true); return; } if(e->button == SDL_BUTTON_LEFT) { //mousepos = vec2(e->x, e->y); mouseclicked=true; if(canSeek()) { float position; if(slider.click(mousepos, &position)) { seekTo(position); } } } } void Gource::showSplash() { splash = 15.0; } void Gource::setFrameExporter(FrameExporter* exporter, int video_framerate) { int gource_framerate = video_framerate; this->framecount = 0; this->frameskip = 0; //calculate appropriate tick rate for video frame rate while(gource_framerate<60) { gource_framerate += video_framerate; this->frameskip++; } this->max_tick_rate = 1.0f / ((float) gource_framerate); this->frameExporter = exporter; } void Gource::setCameraMode(const std::string& mode) { setCameraMode(mode == "track"); } void Gource::setCameraMode(bool track_users) { manual_rotate = false; manual_zoom = false; this->track_users = track_users; if(selectedUser!=0) camera.lockOn(track_users); manual_camera = false; gGourceSettings.camera_mode = track_users ? "track" : "overview"; } void Gource::toggleCameraMode() { setCameraMode(!track_users); } //trace click of mouse on background void Gource::selectBackground() { //is the left mouse button down? if(!cursor.leftButtonPressed()) return; selectUser(0); manual_camera = true; mousedragged=true; grabMouse(true); } //select a user, deselect current file/user void Gource::selectUser(RUser* user) { //already selected do nothing if(user!=0 && selectedUser==user) return; if(selectedFile != 0) { selectedFile->setSelected(false); selectedFile = 0; } // deselect current user if(selectedUser != 0) { selectedUser->setSelected(false); selectedUser = 0; } //if no user return if(user == 0) { camera.lockOn(false); return; } selectedUser = user; //select user, lock on camera selectedUser->setSelected(true); if(track_users) camera.lockOn(true); } //select a file, deselect current file/user void Gource::selectFile(RFile* file) { //already selected do nothing if(file!=0 && selectedFile==file) return; if(selectedUser != 0) { selectedUser->setSelected(false); selectedUser = 0; } // deselect current file if(selectedFile != 0) { selectedFile->setSelected(false); selectedFile = 0; } //if no file return if(file == 0) { return; } selectedFile = file; //select user, lock on camera selectedFile->setSelected(true); } void Gource::selectNextUser() { //debugLog("selectNextUser()\n"); int currTagId = -1; if(selectedUser != 0) { currTagId = selectedUser->getTagID(); } RUser* newSelectedUser = 0; // find next user after this user for(std::map::iterator it = tagusermap.begin(); it != tagusermap.end(); it++) { RUser* user = it->second; if(!user->isInactive() && user->getTagID() > currTagId && user->getAlpha() >= 1.0) { newSelectedUser = user; break; } } // just get first user if(newSelectedUser == 0) { for(std::map::iterator it = tagusermap.begin(); it != tagusermap.end(); it++) { RUser* user = it->second; if(!user->isInactive() && user->getAlpha() >= 1.0) { newSelectedUser = user; break; } } } selectUser(newSelectedUser); } void Gource::keyPress(SDL_KeyboardEvent *e) { if (gGourceSettings.disable_input) return; if (e->type == SDL_KEYUP) return; if (e->type == SDL_KEYDOWN) { #if SDL_VERSION_ATLEAST(2,0,0) bool key_escape = e->keysym.sym == SDLK_ESCAPE; bool key_tab = e->keysym.sym == SDLK_TAB; bool key_space = e->keysym.sym == SDLK_SPACE; bool key_plus = e->keysym.sym == SDLK_PLUS; bool key_equals = e->keysym.sym == SDLK_EQUALS; bool key_minus = e->keysym.sym == SDLK_MINUS; bool key_leftbracket = e->keysym.sym == SDLK_LEFTBRACKET; bool key_rightbracket = e->keysym.sym == SDLK_RIGHTBRACKET; bool key_comma = e->keysym.sym == SDLK_COMMA; bool key_period = e->keysym.sym == SDLK_PERIOD; bool key_slash = e->keysym.sym == SDLK_SLASH; #else bool key_escape = e->keysym.unicode == SDLK_ESCAPE; bool key_tab = e->keysym.unicode == SDLK_TAB; bool key_space = e->keysym.unicode == SDLK_SPACE; bool key_plus = e->keysym.unicode == SDLK_PLUS; bool key_equals = e->keysym.unicode == SDLK_EQUALS; bool key_minus = e->keysym.unicode == SDLK_MINUS; bool key_leftbracket = e->keysym.unicode == SDLK_LEFTBRACKET; bool key_rightbracket = e->keysym.unicode == SDLK_RIGHTBRACKET; bool key_comma = e->keysym.unicode == SDLK_COMMA; bool key_period = e->keysym.unicode == SDLK_PERIOD; bool key_slash = e->keysym.unicode == SDLK_SLASH; #endif if (key_escape) { quit(); } if(commitlog==0) return; if(e->keysym.sym == SDLK_F12) { take_screenshot = true; } if (e->keysym.sym == SDLK_q) { debug = !debug; } if (e->keysym.sym == SDLK_w) { trace_debug = !trace_debug; } if (e->keysym.sym == SDLK_m) { //toggle mouse visiblity unless mouse clicked/pressed/dragged if(!(mousedragged || mouseclicked || cursor.leftButtonPressed() )) { if(!cursor.isHidden()) { cursor.showCursor(false); gGourceSettings.hide_mouse = true; } else { cursor.showCursor(true); gGourceSettings.hide_mouse = false; } } } if (e->keysym.sym == SDLK_n) { idle_time = gGourceSettings.auto_skip_seconds; } if (e->keysym.sym == SDLK_y) { gGourceQuadTreeDebug = !gGourceQuadTreeDebug; } if (e->keysym.sym == SDLK_t) { gGourceSettings.hide_tree = !gGourceSettings.hide_tree; } if (e->keysym.sym == SDLK_g) { gGourceSettings.hide_users = !gGourceSettings.hide_users; } if (e->keysym.sym == SDLK_u) { if(gGourceSettings.hide_usernames && !gGourceSettings.highlight_all_users) { gGourceSettings.hide_usernames = false; gGourceSettings.highlight_all_users = true; } else if (gGourceSettings.highlight_all_users && !gGourceSettings.hide_usernames) { gGourceSettings.hide_usernames = false; gGourceSettings.highlight_all_users = false; } else { gGourceSettings.hide_usernames = true; gGourceSettings.highlight_all_users = false; } } if (e->keysym.sym == SDLK_d) { if(gGourceSettings.hide_dirnames && !gGourceSettings.highlight_dirs) { gGourceSettings.hide_dirnames = false; gGourceSettings.highlight_dirs = true; } else if(gGourceSettings.highlight_dirs && !gGourceSettings.hide_dirnames) { gGourceSettings.hide_dirnames = false; gGourceSettings.highlight_dirs = false; } else { gGourceSettings.hide_dirnames = true; gGourceSettings.highlight_dirs = false; } } if (e->keysym.sym == SDLK_f) { if(gGourceSettings.hide_filenames && !gGourceSettings.file_extensions) { gGourceSettings.hide_filenames = false; } else if(!gGourceSettings.hide_filenames && gGourceSettings.file_extensions) { gGourceSettings.file_extensions = false; gGourceSettings.hide_filenames = true; } else { gGourceSettings.file_extensions = true; gGourceSettings.hide_filenames = false; } } if (e->keysym.sym == SDLK_r) { gGourceSettings.hide_root = !gGourceSettings.hide_root; } if (e->keysym.sym == SDLK_k) { gGourceSettings.show_key = !gGourceSettings.show_key; } if(e->keysym.sym == SDLK_c) { splash = 15.0f; } if (e->keysym.sym == SDLK_v) { toggleCameraMode(); } if (e->keysym.sym == SDLK_p) { if(GLEW_VERSION_2_0 && bloom_shader != 0) { gGourceSettings.ffp = !gGourceSettings.ffp; } } if (e->keysym.sym == SDLK_z) { gGourceGravity = !gGourceGravity; } if (e->keysym.sym == SDLK_s) { recolour=true; } if(key_tab) { selectNextUser(); } if (key_space) { paused = !paused; } if (key_equals || key_plus) { if(gGourceSettings.days_per_second>=1.0) { gGourceSettings.days_per_second = std::min(30.0f, floorf(gGourceSettings.days_per_second) + 1.0f); } else { gGourceSettings.days_per_second = std::min(1.0f, gGourceSettings.days_per_second * 2.0f); } } if (key_minus) { if(gGourceSettings.days_per_second>1.0) { gGourceSettings.days_per_second = std::max(0.0f, floorf(gGourceSettings.days_per_second) - 1.0f); } else { gGourceSettings.days_per_second = std::max(0.0f, gGourceSettings.days_per_second * 0.5f); } } if(e->keysym.sym == SDLK_KP_MINUS) { zoom(true); } if(e->keysym.sym == SDLK_KP_PLUS) { zoom(false); } if(key_leftbracket) { gGourceForceGravity /= 1.1; } if(key_rightbracket) { gGourceForceGravity *= 1.1; } if(key_period) { if(gGourceSettings.time_scale>=1.0) { gGourceSettings.time_scale = std::min(4.0f, floorf(gGourceSettings.time_scale) + 1.0f); } else { gGourceSettings.time_scale = std::min(1.0f, gGourceSettings.time_scale * 2.0f); } } if(key_comma) { if(gGourceSettings.time_scale>1.0) { gGourceSettings.time_scale = std::max(0.0f, floorf(gGourceSettings.time_scale) - 1.0f); } else { gGourceSettings.time_scale = std::max(0.25f, gGourceSettings.time_scale * 0.5f); } } if(key_slash) { gGourceSettings.time_scale = 1.0f; } } } void Gource::reset() { camera.reset(); user_bounds.reset(); active_user_bounds.reset(); dir_bounds.reset(); commitqueue.clear(); tagusermap.clear(); gGourceRemovedFiles.clear(); if(userTree!=0) delete userTree; if(dirNodeTree!=0) delete dirNodeTree; recolour = false; userTree = 0; dirNodeTree = 0; selectedFile = 0; hoverFile = 0; use_selection_bounds = false; selection_bounds.reset(); manual_rotate = false; manual_zoom = false; rotation_remaining_angle = 0.0f; message_timer = 0.0f; cursor_move = vec2(0.0f, 0.0f); selectedUser = 0; hoverUser = 0; manual_camera = false; grab_mouse = false; mouseclicked=false; mousemoved=false; mousedragged = false; commitqueue_max_size = 100; rotate_angle = 0.0f; if(root!=0) delete root; root = new RDirNode(0, "/"); //delete users for(std::map::iterator it = users.begin(); it != users.end(); it++) { delete it->second; } users.clear(); //delete for(std::map::iterator it = files.begin(); it != files.end(); it++) { delete it->second; } for(std::list::iterator it = captions.begin(); it!=captions.end();it++) { delete (*it); } for(std::list::iterator it = active_captions.begin(); it!=active_captions.end();it++) { delete (*it); } files.clear(); captions.clear(); active_captions.clear(); last_percent = 0.0; file_key.clear(); idle_time=0; currtime=0; lasttime=0; subseconds=0.0; tag_seq = 1; commit_seq = 1; } void Gource::deleteFile(RFile* file) { //debugLog("removing file %s\n", file->fullpath.c_str()); root->removeFile(file); if(hoverFile == file) { hoverFile = 0; } if(selectedFile == file) { selectFile(0); } //remove from any users with actions against this file - wrong way around? meh for(std::map::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; user->fileRemoved(file); } files.erase(file->fullpath); file_key.dec(file); //debugLog("removed file %s\n", file->fullpath.c_str()); delete file; } RFile* Gource::addFile(const RCommitFile& cf) { //if we already have max files in circulation //we cant add any more if(gGourceSettings.max_files > 0 && files.size() >= gGourceSettings.max_files) return 0; //see if this is a directory std::string file_as_dir = cf.filename; if(file_as_dir[file_as_dir.size()-1] != '/') file_as_dir.append("/"); if(root->isDir(file_as_dir)) return 0; int tagid = tag_seq++; RFile* file = new RFile(cf.filename, cf.colour, vec2(0.0,0.0), tagid); files[cf.filename] = file; root->addFile(file); file_key.inc(file); while(root->getParent() != 0) { debugLog("parent changed to %s", root->getPath().c_str()); root = root->getParent(); } return file; } RUser* Gource::addUser(const std::string& username) { vec2 pos; if(dir_bounds.area() > 0) { pos = dir_bounds.centre(); } else { pos = vec2(0,0); } int tagid = tag_seq++; RUser* user = new RUser(username, pos, tagid); users[username] = user; tagusermap[tagid] = user; //debugLog("added user %s, tagid = %d\n", username.c_str(), tagid); return user; } void Gource::deleteUser(RUser* user) { if(hoverUser == user) { hoverUser = 0; } if(selectedUser == user) { selectUser(0); } users.erase(user->getName()); tagusermap.erase(user->getTagID()); //debugLog("deleted user %s, tagid = %d\n", user->getName().c_str(), user->getTagID()); delete user; } bool Gource::canSeek() { if(gGourceSettings.hide_progress || commitlog == 0 || !commitlog->isSeekable()) return false; return true; } void Gource::seekTo(float percent) { //debugLog("seekTo(%.2f)\n", percent); if(commitlog == 0 || !commitlog->isSeekable()) return; // end pause if(paused) paused = false; reset(); commitlog->seekTo(percent); } Regex caption_regex("^(?:\\xEF\\xBB\\xBF)?([^|]+)\\|(.+)$"); void Gource::loadCaptions() { if(!gGourceSettings.caption_file.size()) return; std::ifstream cf(gGourceSettings.caption_file.c_str()); if(!cf.is_open()) return; std::string line; std::vector matches; time_t last_timestamp = 0; while(std::getline(cf, line)) { ConfFile::trim(line); if(!caption_regex.match(line, &matches)) continue; time_t timestamp; // Allow timestamp to be a string if(matches[0].size() > 1 && matches[0].find("-", 1) != std::string::npos) { if(!SDLAppSettings::parseDateTime(matches[0], timestamp)) continue; } else { timestamp = (time_t) atoll(matches[0].c_str()); if(!timestamp && matches[0] != "0") continue; } std::string caption = RCommitLog::filter_utf8(matches[1]); //ignore older captions if(timestamp < currtime) continue; //ignore out of order captions if(timestamp < last_timestamp) continue; last_timestamp = timestamp; //fprintf(stderr, "%d %s\n", timestamp, matches[1].c_str()); captions.push_back(new RCaption(caption, timestamp, fontcaption)); } //fprintf(stderr, "loaded %d captions\n", captions.size()); } void Gource::readLog() { if(stop_position_reached) return; //debugLog("readLog()\n"); // read commits until either we are ahead of currtime while((commitlog->hasBufferedCommit() || !commitlog->isFinished()) && (commitqueue.empty() || (commitqueue.back().timestamp <= currtime && commitqueue.size() < commitqueue_max_size)) ) { RCommit commit; if(!commitlog->nextCommit(commit)) { if(!commitlog->isSeekable()) { break; } continue; } if(gGourceSettings.stop_timestamp != 0 && commit.timestamp > gGourceSettings.stop_timestamp) { stop_position_reached = true; break; } commitqueue.push_back(commit); } if(first_read && commitqueue.empty()) { throw SDLAppException("no commits found"); } first_read = false; if(!commitlog->isFinished() && commitlog->isSeekable()) { last_percent = commitlog->getPercent(); slider.setPercent(last_percent); } bool is_finished = commitlog->isFinished(); if( // end reached (gGourceSettings.stop_at_end && is_finished) // stop position reached || (gGourceSettings.stop_position > 0.0 && commitlog->isSeekable() && (is_finished || last_percent >= gGourceSettings.stop_position)) ) { stop_position_reached = true; } if((is_finished || stop_position_reached) && gGourceSettings.file_idle_time_at_end > 0.0f) { gGourceSettings.file_idle_time = gGourceSettings.file_idle_time_at_end; } // useful to figure out where we have crashes //debugLog("current date: %s\n", displaydate.c_str()); } void Gource::processCommit(const RCommit& commit, float t) { //find files of this commit or create it for(std::list::const_iterator it = commit.files.begin(); it != commit.files.end(); it++) { const RCommitFile& cf = *it; RFile* file = 0; //is this a directory (ends in slash) //deleting a directory - find directory: then for each file, remove each file if(!cf.filename.empty() && cf.filename[cf.filename.size()-1] == '/') { //ignore unless it is a delete: we cannot 'add' or 'modify' a directory //as its not a physical entity in Gource, only files are. if(cf.action != "D") continue; std::list dirs; root->findDirs(cf.filename, dirs); for(std::list::iterator it = dirs.begin(); it != dirs.end(); it++) { RDirNode* dir = (*it); //fprintf(stderr, "deleting everything under %s because of %s\n", dir->getPath().c_str(), cf.filename.c_str()); //foreach dir files std::list dir_files; dir->getFilesRecursive(dir_files); for(std::list::iterator it = dir_files.begin(); it != dir_files.end(); it++) { RFile* file = *it; addFileAction(commit, cf, file, t); } } continue; } std::map::iterator seen_file = files.find(cf.filename); if(seen_file != files.end()) file = seen_file->second; if(file == 0) { file = addFile(cf); if(!file) continue; } addFileAction(commit, cf, file, t); } } void Gource::addFileAction(const RCommit& commit, const RCommitFile& cf, RFile* file, float t) { //create user if havent yet. do it here to ensure at least one of there files //was added (incase we hit gGourceSettings.max_files) //find user of this commit or create them RUser* user = 0; //see if user already exists std::map::iterator seen_user = users.find(commit.username); if(seen_user != users.end()) user = seen_user->second; if(user == 0) { user = addUser(commit.username); if(gGourceSettings.highlight_all_users) user->setHighlighted(true); else { // set the highlighted flag if name matches a highlighted user for(std::vector::iterator hi = gGourceSettings.highlight_users.begin(); hi != gGourceSettings.highlight_users.end(); hi++) { std::string highlight = *hi; if(!highlight.empty() && user->getName() == highlight) { user->setHighlighted(true); break; } } } } //create action RAction* userAction = 0; commit_seq++; if(cf.action == "D") { userAction = new RemoveAction(user, file, commit.timestamp, t); } else { if(cf.action == "A") { userAction = new CreateAction(user, file, commit.timestamp, t); } else { userAction = new ModifyAction(user, file, commit.timestamp, t, cf.colour); } } user->addAction(userAction); } void Gource::interactUsers() { // update quad tree Bounds2D quadtreebounds = user_bounds; quadtreebounds.min -= vec2(1.0f, 1.0f); quadtreebounds.max += vec2(1.0f, 1.0f); update_user_tree_time = SDL_GetTicks(); if(userTree != 0) delete userTree; int max_depth = 1; //dont use deep quad tree initially when all the nodes are in one place if(dir_bounds.area() > 10000.0) { max_depth = gGourceMaxQuadTreeDepth; } userTree = new QuadTree(quadtreebounds, max_depth, 1); for(std::map::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; userTree->addItem(user); } //move users - interact with other users and files for(std::map::iterator ait = users.begin(); ait!=users.end(); ait++) { RUser* a = ait->second; UserForceFunctor uff(a); userTree->visitItemsInBounds(a->quadItemBounds, uff); gGourceUserInnerLoops += uff.getLoopCount(); a->applyForceToActions(); } update_user_tree_time = SDL_GetTicks() - update_user_tree_time; } void Gource::updateBounds() { user_bounds.reset(); active_user_bounds.reset(); for(std::map::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; user->updateQuadItemBounds(); user_bounds.update(user->quadItemBounds); if(!user->isIdle()) { active_user_bounds.update(user->quadItemBounds); } } dir_bounds.reset(); for(std::map::iterator it = gGourceDirMap.begin(); it!=gGourceDirMap.end(); it++) { RDirNode* node = it->second; if(node->isVisible()) { node->updateQuadItemBounds(); dir_bounds.update(node->quadItemBounds); } } } void Gource::updateUsers(float t, float dt) { std::vector inactiveUsers; size_t idle_users = 0; // move users for(std::map::iterator it = users.begin(); it!=users.end(); it++) { RUser* u = it->second; u->logic(t, dt); //deselect user if fading out from inactivity if(u->isFading() && selectedUser == u) { selectUser(0); } if(u->isInactive()) { inactiveUsers.push_back(u); } if(u->isIdle()) { idle_users++; } else { //if nothing is selected, and this user is active and this user is the specified user to follow, select them if(selectedUser == 0 && selectedFile == 0) { for(std::vector::iterator ui = gGourceSettings.follow_users.begin(); ui != gGourceSettings.follow_users.end(); ui++) { std::string follow = *ui; if(follow.size() && u->getName() == follow) { selectUser(u); } } } } } if(users.empty() && stop_position_reached) { appFinished = true; } //nothing is moving so increment idle if(idle_users==users.size()) { idle_time += dt; } else { idle_time = 0; } // delete inactive users for(std::vector::iterator it = inactiveUsers.begin(); it != inactiveUsers.end(); it++) { deleteUser(*it); } } void Gource::interactDirs() { // update quad tree Bounds2D quadtreebounds = dir_bounds; quadtreebounds.min -= vec2(1.0f, 1.0f); quadtreebounds.max += vec2(1.0f, 1.0f); update_dir_tree_time = SDL_GetTicks(); if(dirNodeTree !=0) delete dirNodeTree; int max_depth = 1; //dont use deep quad tree initially when all the nodes are in one place if(dir_bounds.area() > 10000.0) { max_depth = gGourceMaxQuadTreeDepth; } dirNodeTree = new QuadTree(quadtreebounds, max_depth, 1); //apply forces with other directories for(std::map::iterator it = gGourceDirMap.begin(); it!=gGourceDirMap.end(); it++) { RDirNode* node = it->second; if(!node->empty()) { dirNodeTree->addItem(node); } } update_dir_tree_time = SDL_GetTicks() - update_dir_tree_time; } void Gource::updateDirs(float dt) { root->applyForces(*dirNodeTree); root->logic(dt); } void Gource::updateTime(time_t display_time) { if(display_time == 0) { displaydate = ""; return; } //display date char datestr[256]; struct tm* timeinfo = localtime ( &display_time ); strftime(datestr, 256, gGourceSettings.date_format.c_str(), timeinfo); displaydate = datestr; //avoid wobbling by only moving font if change is sufficient int date_offset = (int) fontmedium.getWidth(displaydate) * 0.5; if(abs(date_x_offset - date_offset) > 5) date_x_offset = date_offset; } void Gource::updateCamera(float dt) { //camera tracking bool auto_rotate = !manual_rotate && !gGourceSettings.disable_auto_rotate; if(manual_camera) { if(glm::length2(cursor_move) > 0.0f) { float cam_rate = ( -camera.getPos().z ) / ( 5000.0f ); vec3 cam_pos = camera.getPos(); vec2 cursor_delta = cursor_move * cam_rate * 10.0f; cam_pos.x += cursor_delta.x; cam_pos.y += cursor_delta.y; camera.setPos(cam_pos, true); camera.stop(); auto_rotate = false; cursor_move = vec2(0.0f, 0.0f); } } else { Bounds2D cambounds; if(track_users && (selectedFile !=0 || selectedUser !=0)) { Bounds2D focusbounds; if(selectedUser !=0) focusbounds.update(selectedUser->getPos()); if(selectedFile !=0) focusbounds.update(selectedFile->getAbsolutePos()); cambounds = focusbounds; } else { if(track_users && idle_time==0) cambounds = active_user_bounds; else cambounds = dir_bounds; } camera.adjust(cambounds, !manual_zoom); } camera.logic(dt); //automatically rotate camera if(auto_rotate) { if(rotation_remaining_angle > 0.0f) { //rotation through 90 degrees, speed peaks at half way float angle_rate = std::max(dt, (float) (1.0f - fabs((rotation_remaining_angle / 90.0f) - 0.5) * 2.0f)) * dt; rotate_angle = std::min(rotation_remaining_angle, 90.0f * angle_rate); rotation_remaining_angle -= rotate_angle; rotate_angle *= DEGREES_TO_RADIANS; } else if(!cursor.rightButtonPressed() && dir_bounds.area() > 10000.0f) { float aspect_ratio = display.width / (float) display.height; float bounds_ratio = (aspect_ratio > 1.0f) ? dir_bounds.width() / dir_bounds.height() : dir_bounds.height() / dir_bounds.width(); if(bounds_ratio < 0.67f) { rotation_remaining_angle = 90.0f; } } } else { rotation_remaining_angle = 0.0f; } } //change the string hashing seed and recolour files and users void Gource::changeColours() { gStringHashSeed = (rand() % 10000) + 1; for(std::map::iterator it = users.begin(); it != users.end(); it++) { it->second->colourize(); } for(std::map::iterator it = files.begin(); it != files.end(); it++) { it->second->colourize(); } file_key.colourize(); } void Gource::logic(float t, float dt) { if(gGourceSettings.shutdown && logmill->isFinished()) { appFinished=true; return; } if(message_timer>0.0f) message_timer -= dt; if(splash>0.0f) splash -= dt; //init log file if(commitlog == 0) { if(!logmill->isFinished()) return; commitlog = logmill->getLog(); std::string error = logmill->getError(); if(!commitlog) { if(!error.empty()) { throw SDLAppException(error); } else { if(frameExporter!=0) frameExporter->stop(); SDL_Quit(); SDLAppException exception(""); exception.setShowHelp(true); throw exception; } } if(gGourceSettings.start_position>0.0) { seekTo(gGourceSettings.start_position); } } file_key.logic(dt); slider.logic(dt); bool right = false; bool left = false; bool up = false; bool down = false; #if SDL_VERSION_ATLEAST(2,0,0) const Uint8 *keystate = SDL_GetKeyboardState(0); right = keystate[SDL_SCANCODE_RIGHT]; left = keystate[SDL_SCANCODE_LEFT]; up = keystate[SDL_SCANCODE_UP]; down = keystate[SDL_SCANCODE_DOWN]; #else Uint8 *keystate = SDL_GetKeyState(0); right = keystate[SDLK_RIGHT]; left = keystate[SDLK_LEFT]; up = keystate[SDLK_UP]; down = keystate[SDLK_DOWN]; #endif if(right) { cursor_move.x = 10.0; manual_camera = true; } if(left) { cursor_move.x = -10.0; manual_camera = true; } if(up) { cursor_move.y = -10.0; manual_camera = true; } if(down) { cursor_move.y = 10.0; manual_camera = true; } //apply rotation if(rotate_angle != 0.0f) { float s = sinf(rotate_angle); float c = cosf(rotate_angle); if(manual_rotate) { // rotate around camera position if manual vec2 centre = vec2(camera.getPos()); root->rotate(s, c, centre); for(std::map::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; vec2 rotated_user_pos = rotate_vec2(user->getPos() - centre, s, c) + centre; user->setPos(rotated_user_pos); } } else { root->rotate(s, c); for(std::map::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; vec2 rotated_user_pos = rotate_vec2(user->getPos(), s, c); user->setPos(rotated_user_pos); } } rotate_angle = 0.0f; } if(recolour) { changeColours(); recolour = false; } //still want to update camera while paused if(paused) { updateBounds(); interactUsers(); interactDirs(); updateCamera(dt); return; } // get more entries if(commitqueue.empty()) { readLog(); } //loop in attempt to find commits if(gGourceSettings.loop && commitqueue.empty() && commitlog->isSeekable()) { if(idle_time >= gGourceSettings.loop_delay_seconds) { first_read=true; seekTo(0.0); readLog(); } } if(currtime==0 && !commitqueue.empty()) { currtime = lasttime = commitqueue[0].timestamp; subseconds = 0.0; loadCaptions(); } //set current time float time_inc = (dt * 86400.0 * gGourceSettings.days_per_second); int seconds = (int) time_inc; subseconds += time_inc - ((float) seconds); if(subseconds >= 1.0) { currtime += (int) subseconds; subseconds -= (int) subseconds; } currtime += seconds; // delete files for(std::vector::iterator it = gGourceRemovedFiles.begin(); it != gGourceRemovedFiles.end(); it++) { deleteFile(*it); } gGourceRemovedFiles.clear(); //add commits up until the current time while(!commitqueue.empty()) { RCommit commit = commitqueue.front(); //auto skip ahead, unless stop_position_reached if(gGourceSettings.auto_skip_seconds>=0.0 && idle_time >= gGourceSettings.auto_skip_seconds && !stop_position_reached) { currtime = lasttime = commit.timestamp; idle_time = 0.0; } if(commit.timestamp > currtime) break; processCommit(commit, t); if(gGourceSettings.no_time_travel) { if(commit.timestamp > lasttime) { lasttime = commit.timestamp; } } else { // allow for non linear time lines if(lasttime > commit.timestamp) { currtime = commit.timestamp; } lasttime = commit.timestamp; } subseconds = 0.0; commitqueue.pop_front(); } slider.resize(); float caption_height = fontcaption.getMaxHeight(); float caption_start_y = canSeek() ? slider.getBounds().min.y - 35.0f : display.height - fontmedium.getMaxHeight() - 20.0f; if(!gGourceSettings.title.empty()) { caption_start_y = glm::min( caption_start_y, display.height - 20.0f - fontmedium.getMaxHeight() ); } caption_start_y = glm::floor(caption_start_y); if(reloaded) { // reposition active captions float y = caption_start_y; for(RCaption* cap : active_captions) { int caption_offset_x = gGourceSettings.caption_offset; // centre if(caption_offset_x == 0) { caption_offset_x = (display.width / 2) - (fontcaption.getWidth(cap->getCaption()) / 2); } else if(caption_offset_x < 0) { caption_offset_x = display.width + caption_offset_x - fontcaption.getWidth(cap->getCaption()); } cap->setPos(vec2(caption_offset_x, y)); y -= caption_height; } reloaded = false; } while(captions.size() > 0) { RCaption* caption = captions.front(); if(caption->timestamp > currtime) break; float y = caption_start_y; while(1) { bool found = false; for(RCaption* cap : active_captions) { if(cap->getPos().y == y) { found = true; break; } } if(!found) break; y -= caption_height; } int caption_offset_x = gGourceSettings.caption_offset; // centre if(caption_offset_x == 0) { caption_offset_x = (display.width / 2) - (fontcaption.getWidth(caption->getCaption()) / 2); } else if(caption_offset_x < 0) { caption_offset_x = display.width + caption_offset_x - fontcaption.getWidth(caption->getCaption()); } caption->setPos(vec2(caption_offset_x, y)); captions.pop_front(); active_captions.push_back(caption); } for(std::list::iterator it = active_captions.begin(); it!=active_captions.end();) { RCaption* caption = *it; caption->logic(dt); if(caption->isFinished()) { it = active_captions.erase(it); delete caption; continue; } it++; } //reset loop counters gGourceUserInnerLoops = 0; gGourceDirNodeInnerLoops = 0; gGourceFileInnerLoops = 0; updateBounds(); interactUsers(); updateUsers(t, dt); interactDirs(); updateDirs(dt); updateCamera(dt); updateTime(!commitqueue.empty() ? currtime : lasttime); } void Gource::mousetrace(float dt) { vec3 cam_pos = camera.getPos(); vec2 projected_mouse = vec2( -(mousepos.x * 2.0f - ((float)display.width)) / ((float)display.height), (1.0f - (2.0f * mousepos.y) / ((float)display.height))) * cam_pos.z; projected_mouse.x += cam_pos.x; projected_mouse.y += cam_pos.y; //find user/file under mouse RFile* fileSelection = 0; RUser* userSelection = 0; if(!gGourceSettings.hide_users) { std::set userset; userTree->getItemsAt(userset, projected_mouse); for(std::set::iterator it = userset.begin(); it != userset.end(); it++) { RUser* user = (RUser*) *it; if(!user->isFading() && user->quadItemBounds.contains(projected_mouse)) { userSelection = user; break; } } } if(!userSelection && !gGourceSettings.hide_files) { std::set dirset; dirNodeTree->getItemsAt(dirset, projected_mouse); for(std::set::iterator it = dirset.begin(); it != dirset.end(); it++) { RDirNode* dir = (RDirNode*) *it; const std::list* files = dir->getFiles(); for(std::list::const_iterator fi = files->begin(); fi != files->end(); fi++) { RFile* file = *fi; if(!file->isHidden() && file->overlaps(projected_mouse)) { fileSelection = file; break; } } } } // is over a file if(fileSelection != 0) { // un hover a user if(hoverUser != 0) { hoverUser->setMouseOver(false); hoverUser = 0; } if(fileSelection != hoverFile) { //deselect previous selection if(hoverFile !=0) hoverFile->setMouseOver(false); //select new fileSelection->setMouseOver(true); hoverFile = fileSelection; } // is over a user } else if(userSelection != 0) { // un hover a file if(hoverFile != 0) { hoverFile->setMouseOver(false); hoverFile = 0; } if(userSelection != hoverUser) { //deselect previous selection if(hoverUser !=0) hoverUser->setMouseOver(false); //select new userSelection->setMouseOver(true); hoverUser = userSelection; } } else { if(hoverFile!=0) hoverFile->setMouseOver(false); if(hoverUser!=0) hoverUser->setMouseOver(false); hoverFile=0; hoverUser=0; } if(mouseclicked) { if(hoverUser!=0) { camera.lockOn(false); selectUser(hoverUser); } else if(hoverFile!=0) { camera.lockOn(false); selectFile(hoverFile); } else { selectBackground(); } } //fprintf(stderr, "end trace\n"); } void Gource::loadingScreen() { if(!gGourceDrawBackground) return; display.mode2D(); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glColor4f(1.0, 1.0, 1.0, 1.0); const char* progress = ""; switch(int(runtime*3.0f)%4) { case 0: progress = ""; break; case 1: progress = "."; break; case 2: progress = ".."; break; case 3: progress = "..."; break; } const char* action = !gGourceSettings.shutdown ? "Reading Log" : "Aborting"; int width = font.getWidth(action); font.setColour(vec4(1.0f)); font.print(display.width/2 - width/2, display.height/2 - 10, "%s%s", action, progress); } void Gource::drawBackground(float dt) { if(!gGourceDrawBackground) return; display.setClearColour(vec4(gGourceSettings.background_colour, gGourceSettings.transparent ? 0.0f : 1.0f)); display.clear(); if(backgroundtex!=0) { glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glColor4f(1.0, 1.0, 1.0, 1.0); glBindTexture(GL_TEXTURE_2D, backgroundtex->textureid); glPushMatrix(); glTranslatef(display.width/2 - backgroundtex->w/2, display.height/2 - backgroundtex->h/2, 0.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex2i(0, 0); glTexCoord2f(1.0f,0.0f); glVertex2i(backgroundtex->w, 0); glTexCoord2f(1.0f,1.0f); glVertex2i(backgroundtex->w, backgroundtex->h); glTexCoord2f(0.0f,1.0f); glVertex2i(0, backgroundtex->h); glEnd(); glPopMatrix(); } } void Gource::drawScene(float dt) { //draw edges draw_edges_time = SDL_GetTicks(); updateAndDrawEdges(); draw_edges_time = SDL_GetTicks() - draw_edges_time; //draw file shadows draw_shadows_time = SDL_GetTicks(); drawFileShadows(dt); draw_shadows_time = SDL_GetTicks() - draw_shadows_time; //draw actions draw_actions_time = SDL_GetTicks(); drawActions(dt); draw_actions_time = SDL_GetTicks() - draw_actions_time; //draw files draw_files_time = SDL_GetTicks(); drawFiles(dt); draw_files_time = SDL_GetTicks() - draw_files_time; //draw users draw_users_time = SDL_GetTicks(); drawUserShadows(dt); drawUsers(dt); draw_users_time = SDL_GetTicks() - draw_users_time; //draw bloom draw_bloom_time = SDL_GetTicks(); drawBloom(dt); draw_bloom_time = SDL_GetTicks() - draw_bloom_time; } void Gource::updateAndDrawEdges() { root->calcEdges(); if(gGourceSettings.hide_tree) return; //switch to 2d glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, display.width, display.height, 0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D, beamtex->textureid); if(!gGourceSettings.ffp) { edge_vbo.reset(); root->updateEdgeVBO(edge_vbo); edge_vbo.update(); shadow_shader->setSampler2D("tex", 0); shadow_shader->setFloat("shadow_strength", 0.5); shadow_shader->use(); vec2 shadow_offset = vec2(2.0, 2.0); glPushMatrix(); glTranslatef(shadow_offset.x, shadow_offset.y, 0.0f); edge_vbo.draw(); glPopMatrix(); glUseProgramObjectARB(0); edge_vbo.draw(); } else { root->drawEdgeShadows(); root->drawEdges(); } //switch back glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); } void Gource::drawActions(float dt) { if(gGourceSettings.hide_users) return; glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, beamtex->textureid); glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if(!gGourceSettings.ffp) { action_vbo.draw(); } else { //draw actions for(std::map::iterator it = users.begin(); it!=users.end(); it++) { it->second->drawActions(dt); } } } void Gource::drawBloom(float dt) { if(gGourceSettings.hide_bloom) return; glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc (GL_ONE, GL_ONE); if(!gGourceSettings.ffp) { bloom_shader->use(); bloom_vbo.draw(); glUseProgramObjectARB(0); } else { //draw 'gourceian blur' around dirnodes glBindTexture(GL_TEXTURE_2D, bloomtex->textureid); root->drawBloom(dt); } } void Gource::setMessage(const char* str, ...) { char msgbuff[1024]; va_list vl; va_start(vl, str); vsnprintf(msgbuff, 1024, str, vl); va_end(vl); message = std::string(msgbuff); message_timer = 5.0; } void Gource::screenshot() { //get next free recording name char pngname[256]; struct stat finfo; int pngno = 1; while(pngno < 10000) { snprintf(pngname, 256, "gource-%04d.png", pngno); if(stat(pngname, &finfo) != 0) break; pngno++; } //write png std::string filename(pngname); PNGWriter png(gGourceSettings.transparent ? 4 : 3); png.screenshot(filename); setMessage("Wrote screenshot %s", pngname); } void Gource::updateVBOs(float dt) { if(gGourceSettings.ffp) return; if(!gGourceSettings.hide_users) { user_vbo.reset(); action_vbo.reset(); //use a separate vbo for each user texture for(std::map::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; float alpha = user->getAlpha(); vec3 col = user->getColour(); vec2 scaled_dims = user->dims; if(gGourceSettings.fixed_user_size) scaled_dims *= (-camera.getPos().z / -starting_z); user_vbo.add(user->graphic->textureid, user->getPos() - scaled_dims*0.5f, scaled_dims, vec4(col.x, col.y, col.z, alpha)); //draw actions user->updateActionsVBO(action_vbo); } user_vbo.update(); action_vbo.update(); } if(!gGourceSettings.hide_bloom) { bloom_vbo.reset(); root->updateBloomVBO(bloom_vbo, dt); bloom_vbo.update(); } if(!gGourceSettings.hide_files) { file_vbo.reset(); root->updateFilesVBO(file_vbo, dt); file_vbo.update(); } } void Gource::drawFileShadows(float dt) { if(gGourceSettings.hide_files) return; glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if(!gGourceSettings.ffp) { shadow_shader->setSampler2D("tex", 0); shadow_shader->setFloat("shadow_strength", 0.5); shadow_shader->use(); glBindTexture(GL_TEXTURE_2D, gGourceSettings.file_graphic->textureid); glPushMatrix(); glTranslatef(2.0f, 2.0f, 0.0f); file_vbo.draw(); glPopMatrix(); glUseProgramObjectARB(0); } else { root->drawShadows(dt); } } void Gource::drawUserShadows(float dt) { if(gGourceSettings.hide_users) return; glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if(!gGourceSettings.ffp) { shadow_shader->setSampler2D("tex", 0); shadow_shader->setFloat("shadow_strength", 0.5); shadow_shader->use(); vec2 shadow_offset = vec2(2.0, 2.0) * gGourceSettings.user_scale; glPushMatrix(); glTranslatef(shadow_offset.x, shadow_offset.y, 0.0f); user_vbo.draw(); glPopMatrix(); glUseProgramObjectARB(0); } else { for(std::map::iterator it = users.begin(); it!=users.end(); it++) { it->second->drawShadow(dt); } } } void Gource::drawFiles(float dt) { if(gGourceSettings.hide_files) return; if(trace_debug) { glDisable(GL_TEXTURE_2D); } else { glEnable(GL_TEXTURE_2D); } glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if(!gGourceSettings.ffp) { glBindTexture(GL_TEXTURE_2D, gGourceSettings.file_graphic->textureid); file_vbo.draw(); } else { root->drawFiles(dt); } } void Gource::drawUsers(float dt) { if(gGourceSettings.hide_users) return; if(trace_debug) { glDisable(GL_TEXTURE_2D); } else { glEnable(GL_TEXTURE_2D); } glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if(!gGourceSettings.ffp) { user_vbo.draw(); } else { for(std::map::iterator it = users.begin(); it!=users.end(); it++) { it->second->draw(dt); } } } void Gource::draw(float t, float dt) { display.mode2D(); drawBackground(dt); if(!commitlog) { loadingScreen(); return; } Frustum frustum(camera.getPos(), camera.getTarget(), camera.getUp(), camera.getFOV(), camera.getZNear(), camera.getZFar()); trace_time = SDL_GetTicks(); if(!gGourceSettings.hide_mouse && cursor.isVisible()) { mousetrace(dt); } else { if(hoverUser) { hoverUser->setMouseOver(false); hoverUser = 0; } if(hoverFile) { hoverFile->setMouseOver(false); hoverFile = 0; } } trace_time = SDL_GetTicks() - trace_time; glMatrixMode(GL_PROJECTION); glLoadIdentity(); camera.focus(); //check visibility root->checkFrustum(frustum); screen_project_time = SDL_GetTicks(); GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; glGetIntegerv( GL_VIEWPORT, viewport ); glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); root->calcScreenPos(viewport, modelview, projection); for(std::map::iterator it = users.begin(); it!=users.end(); it++) { it->second->calcScreenPos(viewport, modelview, projection); } //need to calc screen pos of selected file if hiding other //file names if(selectedFile!=0 && gGourceSettings.hide_filenames) { selectedFile->calcScreenPos(viewport, modelview, projection); } screen_project_time = SDL_GetTicks() - screen_project_time; //update file and user vbos update_vbos_time = SDL_GetTicks(); updateVBOs(dt); update_vbos_time = SDL_GetTicks() - update_vbos_time; //draw scene draw_scene_time = SDL_GetTicks(); drawScene(dt); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); draw_scene_time = SDL_GetTicks() - draw_scene_time; glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); text_time = text_update_time = SDL_GetTicks(); //switch to 2D, preserve current state display.push2D(); if(!gGourceSettings.ffp) { fontmanager.startBuffer(); } fontdirname.roundCoordinates(false); fontdirname.setColour(vec4(gGourceSettings.dir_colour, 1.0f)); root->drawNames(fontdirname); if(!(gGourceSettings.hide_usernames || gGourceSettings.hide_users)) { for(std::map::iterator it = users.begin(); it!=users.end(); it++) { RUser* user = it->second; if(!user->isSelected()) { user->drawName(); } } } text_update_time = SDL_GetTicks() - text_update_time; text_vbo_commit_time = 0; text_vbo_draw_time = 0; if(!gGourceSettings.ffp) { text_vbo_commit_time = SDL_GetTicks(); fontmanager.commitBuffer(); text_vbo_commit_time = SDL_GetTicks() - text_vbo_commit_time; text_vbo_draw_time = SDL_GetTicks(); text_shader->setSampler2D("tex", 0); text_shader->setFloat("shadow_strength", 0.7); text_shader->setFloat("texel_size", font_texel_size); text_shader->use(); fontmanager.drawBuffer(); glUseProgramObjectARB(0); text_vbo_draw_time = SDL_GetTicks() - text_vbo_draw_time; } //draw selected item names again so they are over the top if(selectedUser !=0) selectedUser->drawName(); if(selectedFile !=0) { selectedFile->drawName(); } //switch back display.pop2D(); text_time = SDL_GetTicks() - text_time; if(debug) { glDisable(GL_TEXTURE_2D); glLineWidth(2.0); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); track_users ? active_user_bounds.draw() : dir_bounds.draw(); } if(gGourceQuadTreeDebug) { glDisable(GL_TEXTURE_2D); glLineWidth(1.0); glColor4f(0.0f, 1.0f, 0.0f, 1.0f); dirNodeTree->outline(); glColor4f(0.0f, 1.0f, 1.0f, 1.0f); userTree->outline(); glColor4f(0.0f, 1.0f, 0.5f, 1.0f); userTree->outlineItems(); } glColor4f(1.0f, 1.0f, 1.0f, 1.0f); display.mode2D(); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); vec3 campos = camera.getPos(); if(logotex!=0) { glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glColor4f(1.0, 1.0, 1.0, 1.0); glBindTexture(GL_TEXTURE_2D, logotex->textureid); vec2 logopos = vec2(display.width, display.height) - vec2(logotex->w, logotex->h) - gGourceSettings.logo_offset; glPushMatrix(); glTranslatef(logopos.x, logopos.y, 0.0); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex2i(0, 0); glTexCoord2f(1.0f,0.0f); glVertex2i(logotex->w, 0); glTexCoord2f(1.0f,1.0f); glVertex2i(logotex->w, logotex->h); glTexCoord2f(0.0f,1.0f); glVertex2i(0, logotex->h); glEnd(); glPopMatrix(); } font.roundCoordinates(true); if(splash>0.0f) { int logowidth = fontlarge.getWidth("Gource"); int logoheight = 100 * gGourceSettings.font_scale; int cwidth = font.getWidth("Software Version Control Visualization"); int awidth = font.getWidth("(C) 2009 Andrew Caudwell"); vec2 corner(display.width/2 - logowidth/2 - 30.0f * gGourceSettings.font_scale, display.height/2 - 40 * gGourceSettings.font_scale); glDisable(GL_TEXTURE_2D); glColor4f(0.0f, 0.5f, 1.0f, splash * 0.015f); glBegin(GL_QUADS); glVertex2f(0.0f, corner.y); glVertex2f(0.0f, corner.y + logoheight); glVertex2f(display.width, corner.y + logoheight); glVertex2f(display.width, corner.y); glEnd(); glEnable(GL_TEXTURE_2D); fontlarge.setColour(vec4(1.0f)); fontlarge.draw(display.width/2 - logowidth/2,display.height/2 - 30 * gGourceSettings.font_scale, "Gource"); font.setColour(vec4(1.0f)); font.draw(display.width/2 - cwidth/2,display.height/2 + 10 * gGourceSettings.font_scale, "Software Version Control Visualization"); font.draw(display.width/2 - awidth/2,display.height/2 + 30 * gGourceSettings.font_scale, "(C) 2009 Andrew Caudwell"); } // text using the specified font goes here fontmedium.setColour(vec4(gGourceSettings.font_colour, 1.0f)); if(!gGourceSettings.hide_date) { fontmedium.draw(display.width/2 - date_x_offset, 20, displaydate); } if(!gGourceSettings.title.empty()) { fontmedium.alignTop(false); fontmedium.draw(10, display.height - 10, gGourceSettings.title); fontmedium.alignTop(true); } for(std::list::iterator it = active_captions.begin(); it!=active_captions.end(); it++) { RCaption* caption = *it; caption->draw(); } //file key file_key.draw(); file_key.setShow(gGourceSettings.show_key); //slider if(canSeek()) { slider.draw(dt); } //text box if(hoverFile && hoverFile != selectedFile) { std::string display_path = hoverFile->path; display_path.erase(0,1); textbox.setText(hoverFile->getName()); if(display_path.size()) textbox.addLine(display_path); textbox.setColour(hoverFile->getColour()); textbox.setPos(mousepos, true); textbox.draw(); } else if(hoverUser && hoverUser != selectedUser) { textbox.setText(hoverUser->getName()); textbox.setColour(hoverUser->getColour()); textbox.setPos(mousepos, true); textbox.draw(); } //debug info if(debug) { font.setColour(vec4(1.0f)); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); font.print(1,20, "FPS: %.2f", fps); font.print(1,40,"Days Per Second: %.2f", gGourceSettings.days_per_second); font.print(1,60,"Commit Queue: %d", commitqueue.size()); font.print(1,80,"Users: %d", users.size()); font.print(1,100,"Files: %d", files.size()); font.print(1,120,"Dirs: %d", gGourceDirMap.size()); font.print(1,140,"Log Position: %.4f", commitlog->getPercent()); font.print(1,160,"Camera: (%.2f, %.2f, %.2f)", campos.x, campos.y, campos.z); font.print(1,180,"Gravity: %.2f", gGourceForceGravity); font.print(1,200,"Update Tree: %u ms", update_dir_tree_time); font.print(1,220,"Update VBOs: %u ms", update_vbos_time); font.print(1,240,"Projection: %u ms", screen_project_time); font.print(1,260,"Draw Scene: %u ms", draw_scene_time); font.print(1,280," - Edges: %u ms", draw_edges_time); font.print(1,300," - Shadows: %u ms", draw_shadows_time); font.print(1,320," - Actions: %u ms", draw_actions_time); font.print(1,340," - Files: %u ms", draw_files_time); font.print(1,360," - Users: %u ms", draw_users_time); font.print(1,380," - Bloom: %u ms", draw_bloom_time); font.print(1,400,"Text: %u ms", text_time); font.print(1,420,"- Update: %u ms", text_update_time); font.print(1,440,"- VBO Commit: %u ms", text_vbo_commit_time); font.print(1,460,"- VBO Draw: %u ms", text_vbo_draw_time); font.print(1,480,"Mouse Trace: %u ms", trace_time); font.print(1,500,"Logic Time: %u ms", logic_time); font.print(1,520,"File Inner Loops: %d", gGourceFileInnerLoops); font.print(1,540,"User Inner Loops: %d", gGourceUserInnerLoops); font.print(1,560,"Dir Inner Loops: %d (QTree items = %d, nodes = %d, max node depth = %d)", gGourceDirNodeInnerLoops, dirNodeTree->item_count, dirNodeTree->node_count, dirNodeTree->max_node_depth); font.print(1,580,"Dir Bounds Ratio: %.2f, %.5f", dir_bounds.width() / dir_bounds.height(), rotation_remaining_angle); font.print(1,600,"String Hash Seed: %d", gStringHashSeed); if(!gGourceSettings.ffp) { font.print(1,620,"Text VBO: %d/%d vertices, %d texture changes", fontmanager.font_vbo.vertices(), fontmanager.font_vbo.capacity(), fontmanager.font_vbo.texture_changes()); font.print(1,640,"File VBO: %d/%d vertices, %d texture changes", file_vbo.vertices(), file_vbo.capacity(), file_vbo.texture_changes()); font.print(1,660,"User VBO: %d/%d vertices, %d texture changes", user_vbo.vertices(), user_vbo.capacity(), user_vbo.texture_changes()); font.print(1,680,"Action VBO: %d/%d vertices", action_vbo.vertices(), action_vbo.capacity()); font.print(1,700,"Bloom VBO: %d/%d vertices", bloom_vbo.vertices(), bloom_vbo.capacity()); font.print(1,720,"Edge VBO: %d/%d vertices", edge_vbo.vertices(), edge_vbo.capacity()); } if(selectedUser != 0) { } if(selectedFile != 0) { font.print(1,740,"%s: %d files (%d visible)", selectedFile->getDir()->getPath().c_str(), selectedFile->getDir()->fileCount(), selectedFile->getDir()->visibleFileCount()); } } mousemoved=false; mouseclicked=false; if(take_screenshot) { screenshot(); take_screenshot = false; } if(message_timer > 0.0f) { font.setColour(vec4(1.0f)); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); font.draw(1, 3, message); } } gource-0.54/src/gource_shell.h0000644002342600234260000000323114362112042016173 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #ifndef GOURCE_SHELL_H #define GOURCE_SHELL_H #include "core/display.h" #include "core/sdlapp.h" #include "gource.h" class GourceShell : public SDLApp { Gource* gource; bool next; TextureResource* transition_texture; float transition_interval; float toggle_delay; FrameExporter* exporter; ConfFile* conf; ConfSectionList::iterator gource_settings; Gource* getNext(); void blendLastFrame(float dt); public: GourceShell(ConfFile* conf, FrameExporter* exporter); ~GourceShell(); void update(float t, float dt); void resize(int width, int height); void reload(); void toggleFullscreen(); void toggleWindowFrame(); void quit(); void keyPress(SDL_KeyboardEvent *e); void mouseMove(SDL_MouseMotionEvent *e); void mouseClick(SDL_MouseButtonEvent *e); #if SDL_VERSION_ATLEAST(2,0,0) void mouseWheel(SDL_MouseWheelEvent *e); #endif }; #endif extern GourceShell* gGourceShell; gource-0.54/src/textbox.cpp0000644002342600234260000000756214362112042015563 0ustar andrewcandrewc/* Copyright (C) 2010 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "textbox.h" TextBox::TextBox() { } TextBox::TextBox(const FXFont& font) { this->font = font; shadow = vec2(3.0f, 3.0f); colour = vec3(0.7f, 0.7f, 0.7f); corner = vec2(0.0f,0.0f); alpha = 1.0f; brightness = 1.0f; max_width_chars = 1024; rect_width = 0; rect_height = 0; visible = false; } void TextBox::hide() { visible = false; } void TextBox::show() { visible = true; } void TextBox::setBrightness(float brightness) { this->brightness = brightness; } void TextBox::setColour(const vec3& colour) { this->colour = colour; } void TextBox::setAlpha(float alpha) { this->alpha = alpha; } void TextBox::clear() { content.clear(); rect_width = 0; rect_height = 2; } void TextBox::addLine(std::string str) { if(max_width_chars> 0 && str.size() > max_width_chars) { str = str.substr(0, max_width_chars); } int width = font.getWidth(str) + 6; if(width > rect_width) rect_width = width; rect_height += (font.getFontSize()+4); content.push_back(str); } void TextBox::setText(const std::string& str) { clear(); addLine(str); } void TextBox::setText(const std::vector& content) { clear(); for(std::vector::const_iterator it = content.begin(); it != content.end(); it++) { addLine(*it); } } void TextBox::setPos(const vec2& pos, bool adjust) { corner = pos; if(!adjust) return; int fontheight = font.getFontSize() + 4; corner.y -= rect_height; if((corner.x + rect_width) > display.width) { if((corner.x - rect_width - fontheight )>0) { corner.x -= rect_width; } else { corner.x = display.width - rect_width; } } if(corner.y < 0) corner.y += rect_height + fontheight; if(corner.y +rect_height > display.height) corner.y -= rect_height; } void TextBox::draw() const { if(!visible) return; glDisable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.0f, 0.0f, 0.0f, alpha * 0.333f); glPushMatrix(); glTranslatef(shadow.x, shadow.y, 0.0f); glBegin(GL_QUADS); glVertex2f(corner.x, corner.y); glVertex2f(corner.x, corner.y + rect_height); glVertex2f(corner.x+rect_width, corner.y + rect_height); glVertex2f(corner.x+rect_width, corner.y); glEnd(); glPopMatrix(); glColor4f(colour.x * brightness, colour.y * brightness, colour.z * brightness, alpha); glBegin(GL_QUADS); glVertex2f(corner.x, corner.y); glVertex2f(corner.x, corner.y + rect_height); glVertex2f(corner.x+rect_width, corner.y + rect_height); glVertex2f(corner.x+rect_width, corner.y); glEnd(); glEnable(GL_TEXTURE_2D); glColor4f(1.0f, 1.0f, 1.0f, alpha); int yinc = 3; std::vector::const_iterator it; for(it = content.begin(); it != content.end(); it++) { font.draw((int)corner.x+2, (int)corner.y+yinc, (*it).c_str()); yinc += font.getFontSize() + 4; } } gource-0.54/src/spline.cpp0000644002342600234260000001037114362112042015350 0ustar andrewcandrewc/* Copyright (C) 2009 Andrew Caudwell (acaudwell@gmail.com) This program is free software; you can 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 . */ #include "spline.h" SplineEdge::SplineEdge() { } void SplineEdge::update(const vec2& pos1, const vec4& col1, const vec2& pos2, const vec4& col2, const vec2& spos) { vec2 pt_last; vec4 col_last; vec2 mid = (pos1 - pos2) * 0.5f; vec2 to = vec2(pos1 - spos); //TODO: not sure this makes any sense //float dp = std::min(1.0f, to.normal().dot(mid.normal())); float dp = std::min(1.0f, glm::dot(normalise(to), normalise(mid)) ); float ang = acos(dp) / PI; int edge_detail = std::min(10, (int) (ang * 100.0)); if(edge_detail<1) edge_detail = 1; spline_point.clear(); spline_colour.clear(); spline_point.reserve(edge_detail+1); spline_colour.reserve(edge_detail+1); //calculate positions for(int i=0; i <= edge_detail; i++) { float t = (float)i/edge_detail; float tt = 1.0f-t; vec2 p0 = pos1 * t + spos * tt; vec2 p1 = spos * t + pos2 * tt; vec2 pt = p0 * t + p1 * tt; vec4 coln = col1 * t + col2 * tt; spline_point.push_back(pt); spline_colour.push_back(coln); } const float pos = gGourceSettings.dir_name_position; const float s_quota = 0.5f - glm::abs(pos - 0.5f); const float p_quota = 1.0f - s_quota; label_pos = pos1 * (p_quota * (1.0f - pos)) + pos2 * (p_quota * pos) + spos * s_quota; } const vec2& SplineEdge::getLabelPos() const { return label_pos; } void SplineEdge::drawToVBO(quadbuf& buffer) const { int edges_count = spline_point.size() - 1; for(int i=0; i < edges_count; i++) { //vec2 perp = (spline_point[i] - spline_point[i+1]).perpendicular().normal() * 2.5f; vec2 perp = (spline_point[i] - spline_point[i+1]); perp = normalise(vec2(-perp.y, perp.x)) * 2.5f; quadbuf_vertex v1(spline_point[i] + perp, spline_colour[i], vec2(1.0f, 0.0f)); quadbuf_vertex v2(spline_point[i] - perp, spline_colour[i], vec2(0.0f, 0.0f)); quadbuf_vertex v3(spline_point[i+1] - perp, spline_colour[i+1], vec2(0.0f, 0.0f)); quadbuf_vertex v4(spline_point[i+1] + perp, spline_colour[i+1], vec2(1.0f, 0.0f)); buffer.add(0, v1, v2, v3, v4); } } void SplineEdge::drawBeam(const vec2 & pos1, const vec4 & col1, const vec2 & pos2, const vec4 & col2, float radius, bool first) const{ //vec2 perp = (pos1 - pos2).perpendicular().normal() * radius; vec2 perp = (pos1 - pos2); perp = normalise(vec2(-perp.y, perp.x)) * radius; // src point if(first) { glColor4fv(glm::value_ptr(col1)); glTexCoord2f(1.0,0.0); glVertex2f(pos1.x + perp.x, pos1.y + perp.y); glTexCoord2f(0.0,0.0); glVertex2f(pos1.x - perp.x, pos1.y - perp.y); } // dest point glColor4fv(glm::value_ptr(col2)); glTexCoord2f(1.0,0.0); glVertex2f(pos2.x + perp.x, pos2.y + perp.y); glTexCoord2f(0.0,0.0); glVertex2f(pos2.x - perp.x, pos2.y - perp.y); } void SplineEdge::drawShadow() const{ int edges_count = spline_point.size() - 1; vec2 offset(2.0, 2.0); glBegin(GL_QUAD_STRIP); for(int i=0;i